annotate mercurial/scmutil.py @ 36687:e1c6c1f9855d

py3: accept both unicode and byte strings as filename carried by IOError Follows up 77f98867538f. We could assume there's no bytes filename in our codebase, but it's probably better to not raise UnicodeError because of a unicode filename.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 03 Mar 2018 15:41:12 -0500
parents 77f98867538f
children b76248e51605
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
1 # scmutil.py - Mercurial core utility functions
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
2 #
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
3 # Copyright Matt Mackall <mpm@selenic.com>
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
4 #
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
7
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
8 from __future__ import absolute_import
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
9
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
10 import errno
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
11 import glob
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29336
diff changeset
12 import hashlib
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
13 import os
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
14 import re
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
15 import socket
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
16 import subprocess
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
17 import weakref
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
18
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
19 from .i18n import _
32678
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
20 from .node import (
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
21 hex,
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
22 nullid,
34334
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
23 short,
32678
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
24 wdirid,
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
25 wdirrev,
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
26 )
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
27
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
28 from . import (
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
29 encoding,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
30 error,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
31 match as matchmod,
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
32 obsolete,
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
33 obsutil,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
34 pathutil,
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
35 phases,
30318
af7c60988f6e py3: make scmutil.rcpath() return bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30109
diff changeset
36 pycompat,
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30644
diff changeset
37 revsetlang,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
38 similar,
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
39 url,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
40 util,
34543
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
41 vfs,
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
42 )
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
43
34645
75979c8d4572 codemod: use pycompat.iswindows
Jun Wu <quark@fb.com>
parents: 34620
diff changeset
44 if pycompat.iswindows:
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
45 from . import scmwindows as scmplatform
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
46 else:
27482
dde3da2246f1 scmutil: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27093
diff changeset
47 from . import scmposix as scmplatform
18690
4c6f7f0dadab scmutil: split platform-specific bits into their own modules
Kevin Bullock <kbullock@ringworld.org>
parents: 18678
diff changeset
48
30327
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30322
diff changeset
49 termsize = scmplatform.termsize
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
50
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
51 class status(tuple):
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
52 '''Named tuple with a list of files per status. The 'deleted', 'unknown'
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
53 and 'ignored' properties are only relevant to the working copy.
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
54 '''
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
55
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
56 __slots__ = ()
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
57
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
58 def __new__(cls, modified, added, removed, deleted, unknown, ignored,
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
59 clean):
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
60 return tuple.__new__(cls, (modified, added, removed, deleted, unknown,
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
61 ignored, clean))
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
62
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
63 @property
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
64 def modified(self):
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
65 '''files that have been modified'''
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
66 return self[0]
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
67
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
68 @property
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
69 def added(self):
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
70 '''files that have been added'''
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
71 return self[1]
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
72
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
73 @property
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
74 def removed(self):
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
75 '''files that have been removed'''
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
76 return self[2]
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
77
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
78 @property
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
79 def deleted(self):
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
80 '''files that are in the dirstate, but have been deleted from the
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
81 working copy (aka "missing")
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
82 '''
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
83 return self[3]
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
84
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
85 @property
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
86 def unknown(self):
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
87 '''files not in the dirstate that are not ignored'''
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
88 return self[4]
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
89
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
90 @property
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
91 def ignored(self):
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
92 '''files not in the dirstate that are ignored (by _dirignore())'''
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
93 return self[5]
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
94
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
95 @property
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
96 def clean(self):
22915
4d680deb0d9e status: update and move documentation of status types to status class
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22913
diff changeset
97 '''files that have not been modified'''
22913
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
98 return self[6]
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
99
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
100 def __repr__(self, *args, **kwargs):
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
101 return (('<status modified=%r, added=%r, removed=%r, deleted=%r, '
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
102 'unknown=%r, ignored=%r, clean=%r>') % self)
cb4449921a1d status: create class for status lists
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 22816
diff changeset
103
20392
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
104 def itersubrepos(ctx1, ctx2):
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
105 """find subrepos in ctx1 or ctx2"""
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
106 # Create a (subpath, ctx) mapping where we prefer subpaths from
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
107 # ctx1. The subpaths from ctx2 are important when the .hgsub file
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
108 # has been modified (in ctx2) but not yet committed (in ctx1).
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
109 subpaths = dict.fromkeys(ctx2.substate, ctx2)
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
110 subpaths.update(dict.fromkeys(ctx1.substate, ctx1))
25418
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
111
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
112 missing = set()
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
113
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
114 for subpath in ctx2.substate:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
115 if subpath not in ctx1.substate:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
116 del subpaths[subpath]
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
117 missing.add(subpath)
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
118
20392
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
119 for subpath, ctx in sorted(subpaths.iteritems()):
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
120 yield subpath, ctx.sub(subpath)
d4f804caa0ed itersubrepos: move to scmutil to break a direct import cycle
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
121
25418
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
122 # Yield an empty subrepo based on ctx1 for anything only in ctx2. That way,
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
123 # status and diff will have an accurate result when it does
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
124 # 'sub.{status|diff}(rev2)'. Otherwise, the ctx2 subrepo is compared
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
125 # against itself.
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
126 for subpath in missing:
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
127 yield subpath, ctx2.nullsub(subpath, ctx1)
c0995cd8ff6f scmutil: consistently return subrepos relative to ctx1 from itersubrepos()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25386
diff changeset
128
17248
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
129 def nochangesfound(ui, repo, excluded=None):
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
130 '''Report no changes for push/pull, excluded is None or a list of
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
131 nodes excluded from the push/pull.
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
132 '''
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
133 secretlist = []
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
134 if excluded:
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
135 for n in excluded:
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
136 ctx = repo[n]
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
137 if ctx.phase() >= phases.secret and not ctx.extinct():
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
138 secretlist.append(n)
6ffb35b2284c discovery: add extinct changesets to outgoing.excluded
Patrick Mezard <patrick@mezard.eu>
parents: 17201
diff changeset
139
15993
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
140 if secretlist:
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
141 ui.status(_("no changes found (ignored %d secret changesets)\n")
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
142 % len(secretlist))
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
143 else:
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
144 ui.status(_("no changes found\n"))
0b05e0bfdc1c scmutil: unify some 'no changes found' messages
Matt Mackall <mpm@selenic.com>
parents: 15797
diff changeset
145
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
146 def callcatch(ui, func):
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
147 """call func() with global exception handling
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
148
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
149 return func() if no exception happens. otherwise do some error handling
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
150 and return an exit code accordingly. does not handle all exceptions.
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
151 """
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
152 try:
32041
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
153 try:
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
154 return func()
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
155 except: # re-raises
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
156 ui.traceback()
38963a53ab0d dispatch: print traceback in scmutil.callcatch() if --traceback specified
Yuya Nishihara <yuya@tcha.org>
parents: 31951
diff changeset
157 raise
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
158 # Global exception handling, alphabetically
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
159 # Mercurial-specific first, followed by built-in and library exceptions
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
160 except error.LockHeld as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
161 if inst.errno == errno.ETIMEDOUT:
32088
0d892d820a51 lock: avoid unintentional lock acquisition at failure of readlock
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32041
diff changeset
162 reason = _('timed out waiting for lock held by %r') % inst.locker
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
163 else:
32088
0d892d820a51 lock: avoid unintentional lock acquisition at failure of readlock
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32041
diff changeset
164 reason = _('lock held by %r') % inst.locker
36670
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36598
diff changeset
165 ui.warn(_("abort: %s: %s\n")
36687
e1c6c1f9855d py3: accept both unicode and byte strings as filename carried by IOError
Yuya Nishihara <yuya@tcha.org>
parents: 36670
diff changeset
166 % (inst.desc or util.forcebytestr(inst.filename), reason))
32088
0d892d820a51 lock: avoid unintentional lock acquisition at failure of readlock
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32041
diff changeset
167 if not inst.locker:
0d892d820a51 lock: avoid unintentional lock acquisition at failure of readlock
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32041
diff changeset
168 ui.warn(_("(lock might be very busy)\n"))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
169 except error.LockUnavailable as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
170 ui.warn(_("abort: could not lock %s: %s\n") %
36687
e1c6c1f9855d py3: accept both unicode and byte strings as filename carried by IOError
Yuya Nishihara <yuya@tcha.org>
parents: 36670
diff changeset
171 (inst.desc or util.forcebytestr(inst.filename),
36670
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36598
diff changeset
172 encoding.strtolocal(inst.strerror)))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
173 except error.OutOfBandError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
174 if inst.args:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
175 msg = _("abort: remote error:\n")
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
176 else:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
177 msg = _("abort: remote error\n")
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
178 ui.warn(msg)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
179 if inst.args:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
180 ui.warn(''.join(inst.args))
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
181 if inst.hint:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
182 ui.warn('(%s)\n' % inst.hint)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
183 except error.RepoError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
184 ui.warn(_("abort: %s!\n") % inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
185 if inst.hint:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
186 ui.warn(_("(%s)\n") % inst.hint)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
187 except error.ResponseError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
188 ui.warn(_("abort: %s") % inst.args[0])
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
189 if not isinstance(inst.args[1], basestring):
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
190 ui.warn(" %r\n" % (inst.args[1],))
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
191 elif not inst.args[1]:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
192 ui.warn(_(" empty string\n"))
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
193 else:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
194 ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
195 except error.CensoredNodeError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
196 ui.warn(_("abort: file censored %s!\n") % inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
197 except error.RevlogError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
198 ui.warn(_("abort: %s!\n") % inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
199 except error.InterventionRequired as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
200 ui.warn("%s\n" % inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
201 if inst.hint:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
202 ui.warn(_("(%s)\n") % inst.hint)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
203 return 1
32679
7b17f9de6d3e revlog: map rev(wdirid) to WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents: 32678
diff changeset
204 except error.WdirUnsupported:
7b17f9de6d3e revlog: map rev(wdirid) to WdirUnsupported exception
Yuya Nishihara <yuya@tcha.org>
parents: 32678
diff changeset
205 ui.warn(_("abort: working directory revision cannot be specified\n"))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
206 except error.Abort as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
207 ui.warn(_("abort: %s\n") % inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
208 if inst.hint:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
209 ui.warn(_("(%s)\n") % inst.hint)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
210 except ImportError as inst:
36670
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36598
diff changeset
211 ui.warn(_("abort: %s!\n") % util.forcebytestr(inst))
36452
04c319a07c7b py3: hunt down str(exception) instances and use util.forcebytestr
Augie Fackler <augie@google.com>
parents: 36371
diff changeset
212 m = util.forcebytestr(inst).split()[-1]
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
213 if m in "mpatch bdiff".split():
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
214 ui.warn(_("(did you forget to compile extensions?)\n"))
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
215 elif m in "zlib".split():
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
216 ui.warn(_("(is your Python install correct?)\n"))
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
217 except IOError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
218 if util.safehasattr(inst, "code"):
36295
2b00dda6dad9 scmutil: bytes-ify IOErrors before wrapping them in abort message
Augie Fackler <augie@google.com>
parents: 36183
diff changeset
219 ui.warn(_("abort: %s\n") % util.forcebytestr(inst))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
220 elif util.safehasattr(inst, "reason"):
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
221 try: # usually it is in the form (errno, strerror)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
222 reason = inst.reason.args[1]
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
223 except (AttributeError, IndexError):
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
224 # it might be anything, for example a string
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
225 reason = inst.reason
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
226 if isinstance(reason, unicode):
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
227 # SSLError of Python 2.7.9 contains a unicode
32201
994b0b1c77d6 py3: use encoding.unitolocal instead of .encode(encoding.encoding)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32169
diff changeset
228 reason = encoding.unitolocal(reason)
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
229 ui.warn(_("abort: error: %s\n") % reason)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
230 elif (util.safehasattr(inst, "args")
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
231 and inst.args and inst.args[0] == errno.EPIPE):
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
232 pass
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
233 elif getattr(inst, "strerror", None):
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
234 if getattr(inst, "filename", None):
34040
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 34023
diff changeset
235 ui.warn(_("abort: %s: %s\n") % (
36670
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36598
diff changeset
236 encoding.strtolocal(inst.strerror),
36687
e1c6c1f9855d py3: accept both unicode and byte strings as filename carried by IOError
Yuya Nishihara <yuya@tcha.org>
parents: 36670
diff changeset
237 util.forcebytestr(inst.filename)))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
238 else:
34040
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 34023
diff changeset
239 ui.warn(_("abort: %s\n") % encoding.strtolocal(inst.strerror))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
240 else:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
241 raise
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
242 except OSError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
243 if getattr(inst, "filename", None) is not None:
34040
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 34023
diff changeset
244 ui.warn(_("abort: %s: '%s'\n") % (
36670
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36598
diff changeset
245 encoding.strtolocal(inst.strerror),
36687
e1c6c1f9855d py3: accept both unicode and byte strings as filename carried by IOError
Yuya Nishihara <yuya@tcha.org>
parents: 36670
diff changeset
246 util.forcebytestr(inst.filename)))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
247 else:
34040
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 34023
diff changeset
248 ui.warn(_("abort: %s\n") % encoding.strtolocal(inst.strerror))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
249 except MemoryError:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
250 ui.warn(_("abort: out of memory\n"))
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
251 except SystemExit as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
252 # Commands shouldn't sys.exit directly, but give a return code.
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
253 # Just in case catch this and and pass exit code to caller.
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
254 return inst.code
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
255 except socket.error as inst:
36670
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36598
diff changeset
256 ui.warn(_("abort: %s\n") % util.forcebytestr(inst.args[-1]))
30529
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
257
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
258 return -1
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30427
diff changeset
259
17821
361ab1e2086f scmutil: add bad character checking to checknewlabel
Kevin Bullock <kbullock@ringworld.org>
parents: 17817
diff changeset
260 def checknewlabel(repo, lbl, kind):
19070
290a61833b99 translations: change label integer error to not specify the kind of label
Durham Goode <durham@fb.com>
parents: 18951
diff changeset
261 # Do not use the "kind" parameter in ui output.
290a61833b99 translations: change label integer error to not specify the kind of label
Durham Goode <durham@fb.com>
parents: 18951
diff changeset
262 # It makes strings difficult to translate.
17817
b17be267b59c scmutil: add function to validate new branch, tag, and bookmark names
Kevin Bullock <kbullock@ringworld.org>
parents: 17768
diff changeset
263 if lbl in ['tip', '.', 'null']:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26491
diff changeset
264 raise error.Abort(_("the name '%s' is reserved") % lbl)
17821
361ab1e2086f scmutil: add bad character checking to checknewlabel
Kevin Bullock <kbullock@ringworld.org>
parents: 17817
diff changeset
265 for c in (':', '\0', '\n', '\r'):
361ab1e2086f scmutil: add bad character checking to checknewlabel
Kevin Bullock <kbullock@ringworld.org>
parents: 17817
diff changeset
266 if c in lbl:
36598
bb5f5c1c3c1b scmutil: fix a repr in an error message on Python 3
Augie Fackler <augie@google.com>
parents: 36452
diff changeset
267 raise error.Abort(
bb5f5c1c3c1b scmutil: fix a repr in an error message on Python 3
Augie Fackler <augie@google.com>
parents: 36452
diff changeset
268 _("%r cannot be used in a name") % pycompat.bytestr(c))
18566
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
269 try:
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
270 int(lbl)
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26491
diff changeset
271 raise error.Abort(_("cannot use an integer as a name"))
18566
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
272 except ValueError:
341868ef0cf6 bookmark: don't allow integers as bookmark/branch/tag names
Durham Goode <durham@fb.com>
parents: 18560
diff changeset
273 pass
36183
4f3e989536c3 label: enforce the lack of leading or trailing white space
Boris Feld <boris.feld@octobus.net>
parents: 36175
diff changeset
274 if lbl.strip() != lbl:
4f3e989536c3 label: enforce the lack of leading or trailing white space
Boris Feld <boris.feld@octobus.net>
parents: 36175
diff changeset
275 raise error.Abort(_("leading or trailing whitespace in name %r") % lbl)
17817
b17be267b59c scmutil: add function to validate new branch, tag, and bookmark names
Kevin Bullock <kbullock@ringworld.org>
parents: 17768
diff changeset
276
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
277 def checkfilename(f):
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
278 '''Check that the filename f is an acceptable filename for a tracked file'''
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
279 if '\r' in f or '\n' in f:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26491
diff changeset
280 raise error.Abort(_("'\\n' and '\\r' disallowed in filenames: %r") % f)
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
281
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
282 def checkportable(ui, f):
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
283 '''Check if filename f is portable and warn or abort depending on config'''
13974
23f2736abce3 move checkfilename from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13973
diff changeset
284 checkfilename(f)
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
285 abort, warn = checkportabilityalert(ui)
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
286 if abort or warn:
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
287 msg = util.checkwinfilename(f)
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
288 if msg:
33819
2cd5aba5e1d2 scmutil: use util.shellquote instead of %r
Augie Fackler <augie@google.com>
parents: 33647
diff changeset
289 msg = "%s: %s" % (msg, util.shellquote(f))
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
290 if abort:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26491
diff changeset
291 raise error.Abort(msg)
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
292 ui.warn(_("warning: %s\n") % msg)
14068
04ce8fa1015d add: notify when adding a file that would cause a case-folding collision
Kevin Gessner <kevin@kevingessner.com>
parents: 14067
diff changeset
293
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
294 def checkportabilityalert(ui):
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
295 '''check if the user's config requests nothing, a warning, or abort for
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
296 non-portable filenames'''
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33352
diff changeset
297 val = ui.config('ui', 'portablefilenames')
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
298 lval = val.lower()
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
299 bval = util.parsebool(val)
34645
75979c8d4572 codemod: use pycompat.iswindows
Jun Wu <quark@fb.com>
parents: 34620
diff changeset
300 abort = pycompat.iswindows or lval == 'abort'
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
301 warn = bval or lval == 'warn'
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
302 if bval is None and not (warn or abort or lval == 'ignore'):
13962
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
303 raise error.ConfigError(
8b252e826c68 add: introduce a warning message for non-portable filenames (issue2756) (BC)
Adrian Buehlmann <adrian@cadifra.com>
parents:
diff changeset
304 _("ui.portablefilenames value is invalid ('%s')") % val)
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
305 return abort, warn
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
306
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
307 class casecollisionauditor(object):
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
308 def __init__(self, ui, abort, dirstate):
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
309 self._ui = ui
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
310 self._abort = abort
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
311 allfiles = '\0'.join(dirstate._map)
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
312 self._loweredfiles = set(encoding.lower(allfiles).split('\0'))
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
313 self._dirstate = dirstate
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
314 # The purpose of _newfiles is so that we don't complain about
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
315 # case collisions if someone were to call this object with the
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
316 # same filename twice.
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
317 self._newfiles = set()
14067
e88a4958a6b7 scmutil: refactor ui.portablefilenames processing
Kevin Gessner <kevin@kevingessner.com>
parents: 13986
diff changeset
318
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
319 def __call__(self, f):
20006
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
320 if f in self._newfiles:
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
321 return
14980
28e98a8b173d i18n: use UTF-8 string to lower filename for case collision check
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 14861
diff changeset
322 fl = encoding.lower(f)
20006
9276014db865 scmutil: skip checks in "casecollisionauditor" if filename is already checked
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19900
diff changeset
323 if fl in self._loweredfiles and f not in self._dirstate:
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
324 msg = _('possible case-folding collision for %s') % f
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
325 if self._abort:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26491
diff changeset
326 raise error.Abort(msg)
14138
c18204fd35b0 scmutil: introduce casecollisionauditor
Adrian Buehlmann <adrian@cadifra.com>
parents: 14097
diff changeset
327 self._ui.warn(_("warning: %s\n") % msg)
17201
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
328 self._loweredfiles.add(fl)
afd75476939e scmutil: 25% speedup in casecollisionauditor
Joshua Redstone <joshua.redstone@fb.com>
parents: 17161
diff changeset
329 self._newfiles.add(f)
13970
d13913355390 move opener from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13962
diff changeset
330
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
331 def filteredhash(repo, maxrev):
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
332 """build hash of filtered revisions in the current repoview.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
333
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
334 Multiple caches perform up-to-date validation by checking that the
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
335 tiprev and tipnode stored in the cache file match the current repository.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
336 However, this is not sufficient for validating repoviews because the set
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
337 of revisions in the view may change without the repository tiprev and
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
338 tipnode changing.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
339
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
340 This function hashes all the revs filtered from the view and returns
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
341 that SHA-1 digest.
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
342 """
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
343 cl = repo.changelog
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
344 if not cl.filteredrevs:
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
345 return None
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
346 key = None
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
347 revs = sorted(r for r in cl.filteredrevs if r <= maxrev)
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
348 if revs:
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29336
diff changeset
349 s = hashlib.sha1()
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
350 for rev in revs:
31358
719e64bf9ec2 scmutil: fix key generation to portably bytestringify integer
Augie Fackler <augie@google.com>
parents: 31294
diff changeset
351 s.update('%d;' % rev)
24723
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
352 key = s.digest()
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
353 return key
467a33142425 repoview: move function for computing filtered hash
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24693
diff changeset
354
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
355 def walkrepos(path, followsym=False, seen_dirs=None, recurse=False):
17104
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 17037
diff changeset
356 '''yield every hg repository under path, always recursively.
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 17037
diff changeset
357 The recurse flag will only control recursion into repo working dirs'''
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
358 def errhandler(err):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
359 if err.filename == path:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
360 raise err
14961
5523529bd1af walkrepos: use getattr instead of hasattr for samestat
Augie Fackler <durin42@gmail.com>
parents: 14928
diff changeset
361 samestat = getattr(os.path, 'samestat', None)
5523529bd1af walkrepos: use getattr instead of hasattr for samestat
Augie Fackler <durin42@gmail.com>
parents: 14928
diff changeset
362 if followsym and samestat is not None:
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
363 def adddir(dirlst, dirname):
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
364 dirstat = os.stat(dirname)
36371
ddd9474d2e08 walkrepos: don't reimplement any()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36346
diff changeset
365 match = any(samestat(dirstat, lstdirstat) for lstdirstat in dirlst)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
366 if not match:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
367 dirlst.append(dirstat)
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
368 return not match
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
369 else:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
370 followsym = False
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
371
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
372 if (seen_dirs is None) and followsym:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
373 seen_dirs = []
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
374 adddir(seen_dirs, path)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
375 for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
376 dirs.sort()
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
377 if '.hg' in dirs:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
378 yield root # found a repository
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
379 qroot = os.path.join(root, '.hg', 'patches')
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
380 if os.path.isdir(os.path.join(qroot, '.hg')):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
381 yield qroot # we have a patch queue repo here
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
382 if recurse:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
383 # avoid recursing inside the .hg directory
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
384 dirs.remove('.hg')
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
385 else:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
386 dirs[:] = [] # don't descend further
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
387 elif followsym:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
388 newdirs = []
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
389 for d in dirs:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
390 fname = os.path.join(root, d)
14227
94985b5a8278 scmutil: rename local function _add_dir_if_not_there
Adrian Buehlmann <adrian@cadifra.com>
parents: 14226
diff changeset
391 if adddir(seen_dirs, fname):
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
392 if os.path.islink(fname):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
393 for hgname in walkrepos(fname, True, seen_dirs):
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
394 yield hgname
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
395 else:
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
396 newdirs.append(d)
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13974
diff changeset
397 dirs[:] = newdirs
13984
af60153b5e3b move rcpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13975
diff changeset
398
32678
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
399 def binnode(ctx):
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
400 """Return binary node id for a given basectx"""
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
401 node = ctx.node()
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
402 if node is None:
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
403 return wdirid
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
404 return node
55ff67ffcead scmutil: introduce binnode(ctx) as paired function with intrev(ctx)
Yuya Nishihara <yuya@tcha.org>
parents: 32676
diff changeset
405
32676
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32310
diff changeset
406 def intrev(ctx):
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32310
diff changeset
407 """Return integer for a given basectx that can be used in comparison or
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
408 arithmetic operation"""
32676
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32310
diff changeset
409 rev = ctx.rev()
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
410 if rev is None:
25739
3dabc9b7494a changeset_printer: use node.wdirrev to calculate meaningful parentrevs
Yuya Nishihara <yuya@tcha.org>
parents: 25660
diff changeset
411 return wdirrev
24582
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
412 return rev
56fff44cce98 scmutil: add function to help handling workingctx in arithmetic operation
Yuya Nishihara <yuya@tcha.org>
parents: 24447
diff changeset
413
34334
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
414 def formatchangeid(ctx):
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
415 """Format changectx as '{rev}:{node|formatnode}', which is the default
35928
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35748
diff changeset
416 template provided by logcmdutil.changesettemplater"""
34334
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
417 repo = ctx.repo()
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
418 return formatrevnode(repo.ui, intrev(ctx), binnode(ctx))
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
419
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
420 def formatrevnode(ui, rev, node):
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
421 """Format given revision and node depending on the current verbosity"""
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
422 if ui.debugflag:
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
423 hexfunc = hex
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
424 else:
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
425 hexfunc = short
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
426 return '%d:%s' % (rev, hexfunc(node))
4647e0a8d3d7 scmutil: extract helper functions that returns human-readable change id
Yuya Nishihara <yuya@tcha.org>
parents: 34158
diff changeset
427
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33819
diff changeset
428 def revsingle(repo, revspec, default='.', localalias=None):
19509
8963a706e075 revsingle: fix silly API issue (issue2992)
Matt Mackall <mpm@selenic.com>
parents: 19154
diff changeset
429 if not revspec and revspec != 0:
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
430 return repo[default]
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
431
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33819
diff changeset
432 l = revrange(repo, [revspec], localalias=localalias)
22814
8110405cf8ae revset-limit: use boolean testing instead of `len(revs) < 1`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21799
diff changeset
433 if not l:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26491
diff changeset
434 raise error.Abort(_('empty revision set'))
22815
4f81470e83bf revsingle: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22814
diff changeset
435 return repo[l.last()]
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
436
26020
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
437 def _pairspec(revspec):
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30644
diff changeset
438 tree = revsetlang.parse(revspec)
26020
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
439 return tree and tree[0] in ('range', 'rangepre', 'rangepost', 'rangeall')
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
440
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
441 def revpair(repo, revs):
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
442 if not revs:
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
443 return repo.dirstate.p1(), None
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
444
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
445 l = revrange(repo, revs)
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
446
20862
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
447 if not l:
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
448 first = second = None
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
449 elif l.isascending():
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
450 first = l.min()
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
451 second = l.max()
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
452 elif l.isdescending():
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
453 first = l.max()
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
454 second = l.min()
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
455 else:
22816
20d998395ee7 revpair: use `first` and `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22815
diff changeset
456 first = l.first()
20d998395ee7 revpair: use `first` and `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22815
diff changeset
457 second = l.last()
20862
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
458
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
459 if first is None:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26491
diff changeset
460 raise error.Abort(_('empty revision range'))
26836
88c4e97b9669 scmutil: abort if an empty revision is given to revpair()
Matt Harbison <matt_harbison@yahoo.com>
parents: 26587
diff changeset
461 if (first == second and len(revs) >= 2
88c4e97b9669 scmutil: abort if an empty revision is given to revpair()
Matt Harbison <matt_harbison@yahoo.com>
parents: 26587
diff changeset
462 and not all(revrange(repo, [r]) for r in revs)):
88c4e97b9669 scmutil: abort if an empty revision is given to revpair()
Matt Harbison <matt_harbison@yahoo.com>
parents: 26587
diff changeset
463 raise error.Abort(_('empty revision on one side of range'))
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
464
26020
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
465 # if top-level is range expression, the result must always be a pair
cc3a30ff9490 revpair: restrict odd-range handling to top-level x:y expression (issue4774)
Yuya Nishihara <yuya@tcha.org>
parents: 25928
diff changeset
466 if first == second and len(revs) == 1 and not _pairspec(revs[0]):
20862
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
467 return repo.lookup(first), None
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
468
20862
97b2f26dfc43 revpair: smartset compatibility
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20820
diff changeset
469 return repo.lookup(first), repo.lookup(second)
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14261
diff changeset
470
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33819
diff changeset
471 def revrange(repo, specs, localalias=None):
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
472 """Execute 1 to many revsets and return the union.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
473
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
474 This is the preferred mechanism for executing revsets using user-specified
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
475 config options, such as revset aliases.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
476
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
477 The revsets specified by ``specs`` will be executed via a chained ``OR``
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
478 expression. If ``specs`` is empty, an empty result is returned.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
479
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
480 ``specs`` can contain integers, in which case they are assumed to be
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
481 revision numbers.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
482
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
483 It is assumed the revsets are already formatted. If you have arguments
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30644
diff changeset
484 that need to be expanded in the revset, call ``revsetlang.formatspec()``
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
485 and pass the result as an element of ``specs``.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
486
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
487 Specifying a single revset is allowed.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
488
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
489 Returns a ``revset.abstractsmartset`` which is a list-like interface over
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
490 integer revisions.
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
491 """
25928
4ee4f7415095 revrange: evaluate all revset specs at once
Yuya Nishihara <yuya@tcha.org>
parents: 25904
diff changeset
492 allspecs = []
29417
526b027b0130 scmutil: improve documentation of revset APIs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29389
diff changeset
493 for spec in specs:
25904
fbaa2de13cf6 revrange: drop old-style parser in favor of revset (API)
Yuya Nishihara <yuya@tcha.org>
parents: 25772
diff changeset
494 if isinstance(spec, int):
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30644
diff changeset
495 spec = revsetlang.formatspec('rev(%d)', spec)
25928
4ee4f7415095 revrange: evaluate all revset specs at once
Yuya Nishihara <yuya@tcha.org>
parents: 25904
diff changeset
496 allspecs.append(spec)
34023
5e83a8fe6bc4 rebase: initial support for multiple destinations
Jun Wu <quark@fb.com>
parents: 33819
diff changeset
497 return repo.anyrevs(allspecs, user=True, localalias=localalias)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
498
26433
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
499 def meaningfulparents(repo, ctx):
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
500 """Return list of meaningful (or all if debug) parentrevs for rev.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
501
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
502 For merges (two non-nullrev revisions) both parents are meaningful.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
503 Otherwise the first parent revision is considered meaningful if it
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
504 is not the preceding revision.
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
505 """
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
506 parents = ctx.parents()
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
507 if len(parents) > 1:
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
508 return parents
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
509 if repo.ui.debugflag:
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
510 return [parents[0], repo['null']]
32676
4bec8cce6a09 scmutil: pass ctx object to intrev()
Yuya Nishihara <yuya@tcha.org>
parents: 32310
diff changeset
511 if parents[0].rev() >= intrev(ctx) - 1:
26433
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
512 return []
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
513 return parents
3ad41638b4b4 changeset_printer: move _meaningful_parentrevs() to scmutil
Yuya Nishihara <yuya@tcha.org>
parents: 26421
diff changeset
514
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
515 def expandpats(pats):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
516 '''Expand bare globs when running on windows.
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
517 On posix we assume it already has already been done by sh.'''
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
518 if not util.expandglobs:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
519 return list(pats)
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
520 ret = []
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
521 for kindpat in pats:
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
522 kind, pat = matchmod._patsplit(kindpat, None)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
523 if kind is None:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
524 try:
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
525 globbed = glob.glob(pat)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
526 except re.error:
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
527 globbed = [pat]
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
528 if globbed:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
529 ret.extend(globbed)
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
530 continue
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
531 ret.append(kindpat)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
532 return ret
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
533
26326
58218b0e6005 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26325
diff changeset
534 def matchandpats(ctx, pats=(), opts=None, globbed=False, default='relpath',
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
535 badfn=None):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
536 '''Return a matcher and the patterns that were used.
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
537 The matcher will warn about bad matches, unless an alternate badfn callback
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
538 is provided.'''
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
539 if pats == ("",):
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
540 pats = []
26326
58218b0e6005 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26325
diff changeset
541 if opts is None:
58218b0e6005 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26325
diff changeset
542 opts = {}
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
543 if not globbed and default == 'relpath':
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
544 pats = expandpats(pats or [])
14670
19197fa4c41c scmutil: match now accepts a context or a repo
Matt Mackall <mpm@selenic.com>
parents: 14669
diff changeset
545
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
546 def bad(f, msg):
24338
ca1365078c86 scmutil: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24175
diff changeset
547 ctx.repo().ui.warn("%s: %s\n" % (m.rel(f), msg))
25466
007a1d53f7c3 scmutil: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25434
diff changeset
548
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
549 if badfn is None:
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
550 badfn = bad
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
551
25466
007a1d53f7c3 scmutil: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25434
diff changeset
552 m = ctx.match(pats, opts.get('include'), opts.get('exclude'),
007a1d53f7c3 scmutil: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25434
diff changeset
553 default, listsubrepos=opts.get('subrepos'), badfn=badfn)
007a1d53f7c3 scmutil: use the optional badfn argument when building a matcher
Matt Harbison <matt_harbison@yahoo.com>
parents: 25434
diff changeset
554
24447
d44d53bc9a1e matcher: make e.g. 'relpath:.' lead to fast paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 24338
diff changeset
555 if m.always():
d44d53bc9a1e matcher: make e.g. 'relpath:.' lead to fast paths
Martin von Zweigbergk <martinvonz@google.com>
parents: 24338
diff changeset
556 pats = []
16171
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16167
diff changeset
557 return m, pats
336e61875335 graphlog: restore FILE glob expansion on Windows
Patrick Mezard <patrick@mezard.eu>
parents: 16167
diff changeset
558
26328
188c1e9506f5 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26327
diff changeset
559 def match(ctx, pats=(), opts=None, globbed=False, default='relpath',
188c1e9506f5 match: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26327
diff changeset
560 badfn=None):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
561 '''Return a matcher that will warn about bad matches.'''
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
562 return matchandpats(ctx, pats, opts, globbed, default, badfn=badfn)[0]
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
563
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
564 def matchall(repo):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
565 '''Return a matcher that will efficiently match everything.'''
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
566 return matchmod.always(repo.root, repo.getcwd())
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
567
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
568 def matchfiles(repo, files, badfn=None):
21111
9d28fd795215 match: improve documentation - docstrings and more descriptive variable naming
Mads Kiilerich <madski@unity3d.com>
parents: 20980
diff changeset
569 '''Return a matcher that will efficiently match exactly these files.'''
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
570 return matchmod.exact(repo.root, repo.getcwd(), files, badfn=badfn)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
571
34854
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
572 def parsefollowlinespattern(repo, rev, pat, msg):
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
573 """Return a file name from `pat` pattern suitable for usage in followlines
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
574 logic.
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
575 """
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
576 if not matchmod.patkind(pat):
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
577 return pathutil.canonpath(repo.root, repo.getcwd(), pat)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
578 else:
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
579 ctx = repo[rev]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
580 m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=ctx)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
581 files = [f for f in ctx if m(f)]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
582 if len(files) != 1:
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
583 raise error.ParseError(msg)
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
584 return files[0]
39b094e4ae2c revset: extract a parsefollowlinespattern helper function
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34793
diff changeset
585
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
586 def origpath(ui, repo, filepath):
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
587 '''customize where .orig files are created
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
588
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
589 Fetch user defined path from config file: [ui] origbackuppath = <path>
34158
9e4f82bc2b0b scmutil: don't append .orig to backups in origbackuppath (BC)
Mark Thomas <mbthomas@fb.com>
parents: 34040
diff changeset
590 Fall back to default (filepath with .orig suffix) if not specified
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
591 '''
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33352
diff changeset
592 origbackuppath = ui.config('ui', 'origbackuppath')
34543
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
593 if not origbackuppath:
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
594 return filepath + ".orig"
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
595
34543
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
596 # Convert filepath from an absolute path into a path inside the repo.
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
597 filepathfromroot = util.normpath(os.path.relpath(filepath,
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
598 start=repo.root))
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
599
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
600 origvfs = vfs.vfs(repo.wjoin(origbackuppath))
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
601 origbackupdir = origvfs.dirname(filepathfromroot)
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
602 if not origvfs.isdir(origbackupdir) or origvfs.islink(origbackupdir):
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
603 ui.note(_('creating directory: %s\n') % origvfs.join(origbackupdir))
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
604
34543
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
605 # Remove any files that conflict with the backup file's path
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
606 for f in reversed(list(util.finddirs(filepathfromroot))):
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
607 if origvfs.isfileorlink(f):
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
608 ui.note(_('removing conflicting file: %s\n')
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
609 % origvfs.join(f))
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
610 origvfs.unlink(f)
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
611 break
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
612
34543
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
613 origvfs.makedirs(origbackupdir)
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
614
34972
99ab7bc944d2 scmutil: don't try to delete origbackup symlinks to directories (issue5731)
Mark Thomas <mbthomas@fb.com>
parents: 34854
diff changeset
615 if origvfs.isdir(filepathfromroot) and not origvfs.islink(filepathfromroot):
34543
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
616 ui.note(_('removing conflicting directory: %s\n')
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
617 % origvfs.join(filepathfromroot))
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
618 origvfs.rmtree(filepathfromroot, forcibly=True)
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
619
6fad8059a970 scmutil: handle conflicting files and dirs in origbackuppath
Mark Thomas <mbthomas@fb.com>
parents: 34542
diff changeset
620 return origvfs.join(filepathfromroot)
27651
07fc2f2134ba origpath: move from cmdutil to scmutil
Siddharth Agarwal <sid0@fb.com>
parents: 27610
diff changeset
621
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
622 class _containsnode(object):
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
623 """proxy __contains__(node) to container.__contains__ which accepts revs"""
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
624
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
625 def __init__(self, repo, revcontainer):
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
626 self._torev = repo.changelog.rev
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
627 self._revcontains = revcontainer.__contains__
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
628
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
629 def __contains__(self, node):
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
630 return self._revcontains(self._torev(node))
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
631
34793
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
632 def cleanupnodes(repo, replacements, operation, moves=None, metadata=None):
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
633 """do common cleanups when old nodes are replaced by new nodes
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
634
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
635 That includes writing obsmarkers or stripping nodes, and moving bookmarks.
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
636 (we might also want to move working directory parent in the future)
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
637
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
638 By default, bookmark moves are calculated automatically from 'replacements',
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
639 but 'moves' can be used to override that. Also, 'moves' may include
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
640 additional bookmark moves that should not have associated obsmarkers.
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
641
33685
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
642 replacements is {oldnode: [newnode]} or a iterable of nodes if they do not
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
643 have replacements. operation is a string, like "rebase".
34793
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
644
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
645 metadata is dictionary containing metadata to be stored in obsmarker if
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
646 obsolescence is enabled.
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
647 """
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
648 if not replacements and not moves:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
649 return
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
650
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
651 # translate mapping's other forms
33685
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
652 if not util.safehasattr(replacements, 'items'):
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
653 replacements = {n: () for n in replacements}
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
654
33684
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
655 # Calculate bookmark movements
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
656 if moves is None:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
657 moves = {}
33685
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
658 # Unfiltered repo is needed since nodes in replacements might be hidden.
33684
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
659 unfi = repo.unfiltered()
33685
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
660 for oldnode, newnodes in replacements.items():
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
661 if oldnode in moves:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
662 continue
33684
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
663 if len(newnodes) > 1:
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
664 # usually a split, take the one with biggest rev number
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
665 newnode = next(unfi.set('max(%ln)', newnodes)).node()
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
666 elif len(newnodes) == 0:
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
667 # move bookmark backwards
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
668 roots = list(unfi.set('max((::%n) - %ln)', oldnode,
33685
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
669 list(replacements)))
33684
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
670 if roots:
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
671 newnode = roots[0].node()
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
672 else:
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
673 newnode = nullid
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
674 else:
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
675 newnode = newnodes[0]
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
676 moves[oldnode] = newnode
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
677
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
678 with repo.transaction('cleanup') as tr:
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
679 # Move bookmarks
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
680 bmarks = repo._bookmarks
33511
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
681 bmarkchanges = []
33685
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
682 allnewnodes = [n for ns in replacements.values() for n in ns]
33684
033a5befbaf7 cleanupnodes: separate out bookmark destination calculation from actual update
Martin von Zweigbergk <martinvonz@google.com>
parents: 33647
diff changeset
683 for oldnode, newnode in moves.items():
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
684 oldbmarks = repo.nodebookmarks(oldnode)
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
685 if not oldbmarks:
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
686 continue
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
687 from . import bookmarks # avoid import cycle
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
688 repo.ui.debug('moving bookmarks %r from %s to %s\n' %
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
689 (oldbmarks, hex(oldnode), hex(newnode)))
33331
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
690 # Delete divergent bookmarks being parents of related newnodes
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
691 deleterevs = repo.revs('parents(roots(%ln & (::%n))) - parents(%n)',
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
692 allnewnodes, newnode, oldnode)
4bae3c117b57 scmutil: make cleanupnodes delete divergent bookmarks
Jun Wu <quark@fb.com>
parents: 33330
diff changeset
693 deletenodes = _containsnode(repo, deleterevs)
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
694 for name in oldbmarks:
33511
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
695 bmarkchanges.append((name, newnode))
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
696 for b in bookmarks.divergent2delete(repo, deletenodes, name):
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
697 bmarkchanges.append((b, None))
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
698
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
699 if bmarkchanges:
9689239d7c2b bookmark: use 'divergent2delete' in 'scmutil.cleanupnode'
Boris Feld <boris.feld@octobus.net>
parents: 33505
diff changeset
700 bmarks.applychanges(repo, tr, bmarkchanges)
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
701
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
702 # Obsolete or strip nodes
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
703 if obsolete.isenabled(repo, obsolete.createmarkersopt):
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
704 # If a node is already obsoleted, and we want to obsolete it
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
705 # without a successor, skip that obssolete request since it's
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
706 # unnecessary. That's the "if s or not isobs(n)" check below.
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
707 # Also sort the node in topology order, that might be useful for
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
708 # some obsstore logic.
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
709 # NOTE: the filtering and sorting might belong to createmarkers.
33330
ba43e5ee9c6d scmutil: make cleanupnodes handle filtered node
Jun Wu <quark@fb.com>
parents: 33252
diff changeset
710 isobs = unfi.obsstore.successors.__contains__
ba43e5ee9c6d scmutil: make cleanupnodes handle filtered node
Jun Wu <quark@fb.com>
parents: 33252
diff changeset
711 torev = unfi.changelog.rev
ba43e5ee9c6d scmutil: make cleanupnodes handle filtered node
Jun Wu <quark@fb.com>
parents: 33252
diff changeset
712 sortfunc = lambda ns: torev(ns[0])
33352
967ac37f3d45 cleanupnode: do not use generator for node mapping
Octobus <contact@octobus.net>
parents: 33331
diff changeset
713 rels = [(unfi[n], tuple(unfi[m] for m in s))
33685
2dbd6d259cd2 cleanupnodes: rename "mapping" to "replacements"
Martin von Zweigbergk <martinvonz@google.com>
parents: 33684
diff changeset
714 for n, s in sorted(replacements.items(), key=sortfunc)
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
715 if s or not isobs(n)]
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
716 if rels:
34793
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
717 obsolete.createmarkers(repo, rels, operation=operation,
3df59451cdec scmutil: add capability to cleanupnodes to take obsmarker metadata
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34737
diff changeset
718 metadata=metadata)
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
719 else:
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
720 from . import repair # avoid import cycle
33686
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
721 tostrip = list(replacements)
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
722 if tostrip:
2f427b57bf90 rebase: move bookmarks with --keep (issue5682)
Jun Wu <quark@fb.com>
parents: 33685
diff changeset
723 repair.delayedstrip(repo.ui, repo, tostrip, operation)
33100
65cadeea6c22 scmutil: add a cleanupnodes method for developers
Jun Wu <quark@fb.com>
parents: 32679
diff changeset
724
26329
d9537ce64f3a addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26328
diff changeset
725 def addremove(repo, matcher, prefix, opts=None, dry_run=None, similarity=None):
d9537ce64f3a addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26328
diff changeset
726 if opts is None:
d9537ce64f3a addremove: remove a mutable default argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26328
diff changeset
727 opts = {}
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23481
diff changeset
728 m = matcher
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
729 if dry_run is None:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
730 dry_run = opts.get('dry_run')
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
731 if similarity is None:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
732 similarity = float(opts.get('similarity') or 0)
23533
891aaa7c0c70 scmutil: pass a matcher to scmutil.addremove() instead of a list of patterns
Matt Harbison <matt_harbison@yahoo.com>
parents: 23481
diff changeset
733
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
734 ret = 0
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
735 join = lambda f: os.path.join(prefix, f)
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
736
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
737 wctx = repo[None]
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
738 for subpath in sorted(wctx.substate):
29813
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29782
diff changeset
739 submatch = matchmod.subdirmatcher(subpath, m)
35560189677c subrepo: cleanup of subrepo filematcher logic
Hannes Oldenburg <hannes.christian.oldenburg@gmail.com>
parents: 29782
diff changeset
740 if opts.get('subrepos') or m.exact(subpath) or any(submatch.files()):
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
741 sub = wctx.sub(subpath)
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
742 try:
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
743 if sub.addremove(submatch, prefix, opts, dry_run, similarity):
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
744 ret = 1
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
745 except error.LookupError:
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
746 repo.ui.status(_("skipping missing subrepository: %s\n")
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
747 % join(subpath))
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
748
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
749 rejected = []
23534
83bbedc16b3f addremove: warn when addremove fails to operate on a named path
Matt Harbison <matt_harbison@yahoo.com>
parents: 23533
diff changeset
750 def badfn(f, msg):
83bbedc16b3f addremove: warn when addremove fails to operate on a named path
Matt Harbison <matt_harbison@yahoo.com>
parents: 23533
diff changeset
751 if f in m.files():
25434
5984dd42e140 addremove: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25418
diff changeset
752 m.bad(f, msg)
23534
83bbedc16b3f addremove: warn when addremove fails to operate on a named path
Matt Harbison <matt_harbison@yahoo.com>
parents: 23533
diff changeset
753 rejected.append(f)
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
754
25434
5984dd42e140 addremove: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25418
diff changeset
755 badmatch = matchmod.badmatch(m, badfn)
5984dd42e140 addremove: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25418
diff changeset
756 added, unknown, deleted, removed, forgotten = _interestingfiles(repo,
5984dd42e140 addremove: replace match.bad() monkey patching with match.badmatch()
Matt Harbison <matt_harbison@yahoo.com>
parents: 25418
diff changeset
757 badmatch)
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
758
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
759 unknownset = set(unknown + forgotten)
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
760 toprint = unknownset.copy()
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
761 toprint.update(deleted)
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
762 for abs in sorted(toprint):
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
763 if repo.ui.verbose or not m.exact(abs):
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
764 if abs in unknownset:
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23582
diff changeset
765 status = _('adding %s\n') % m.uipath(abs)
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
766 else:
23686
164915e8ef7b narrowmatcher: propagate the rel() method
Matt Harbison <matt_harbison@yahoo.com>
parents: 23582
diff changeset
767 status = _('removing %s\n') % m.uipath(abs)
18863
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
768 repo.ui.status(status)
1b70e5941ad7 scmutil.addremove: pull ui.status printing out of the loop
Siddharth Agarwal <sid0@fb.com>
parents: 18862
diff changeset
769
19152
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
770 renames = _findrenames(repo, m, added + unknown, removed + deleted,
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
771 similarity)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
772
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
773 if not dry_run:
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
774 _markchanges(repo, unknown + forgotten, deleted, renames)
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
775
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
776 for f in rejected:
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
777 if f in m.files():
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
778 return 1
23537
f1b06a8aad42 commit: propagate --addremove to subrepos if -S is specified (issue3759)
Matt Harbison <matt_harbison@yahoo.com>
parents: 23534
diff changeset
779 return ret
16167
94a8396c9305 addremove: return 1 if we failed to handle any explicit files
Matt Mackall <mpm@selenic.com>
parents: 16115
diff changeset
780
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
781 def marktouched(repo, files, similarity=0.0):
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
782 '''Assert that files have somehow been operated upon. files are relative to
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
783 the repo root.'''
25467
f64dbe06f3d0 scmutil: add an optional parameter to matcher factories for a bad() override
Matt Harbison <matt_harbison@yahoo.com>
parents: 25466
diff changeset
784 m = matchfiles(repo, files, badfn=lambda x, y: rejected.append(x))
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
785 rejected = []
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
786
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
787 added, unknown, deleted, removed, forgotten = _interestingfiles(repo, m)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
788
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
789 if repo.ui.verbose:
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
790 unknownset = set(unknown + forgotten)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
791 toprint = unknownset.copy()
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
792 toprint.update(deleted)
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
793 for abs in sorted(toprint):
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
794 if abs in unknownset:
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
795 status = _('adding %s\n') % abs
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
796 else:
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
797 status = _('removing %s\n') % abs
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
798 repo.ui.status(status)
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
799
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
800 renames = _findrenames(repo, m, added + unknown, removed + deleted,
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
801 similarity)
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
802
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
803 _markchanges(repo, unknown + forgotten, deleted, renames)
19154
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
804
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
805 for f in rejected:
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
806 if f in m.files():
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
807 return 1
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
808 return 0
0c7cf411b390 scmutil: add a function to mark that files have been operated on
Siddharth Agarwal <sid0@fb.com>
parents: 19153
diff changeset
809
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
810 def _interestingfiles(repo, matcher):
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
811 '''Walk dirstate with matcher, looking for files that addremove would care
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
812 about.
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
813
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
814 This is different from dirstate.status because it doesn't care about
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
815 whether files are modified or clean.'''
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
816 added, unknown, deleted, removed, forgotten = [], [], [], [], []
33647
377e8ddaebef pathauditor: disable cache of audited paths by default (issue5628)
Yuya Nishihara <yuya@tcha.org>
parents: 33542
diff changeset
817 audit_path = pathutil.pathauditor(repo.root, cached=True)
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
818
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
819 ctx = repo[None]
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
820 dirstate = repo.dirstate
34350
255c761a52db dirstate: use keyword arguments to clarify walk()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34334
diff changeset
821 walkresults = dirstate.walk(matcher, subrepos=sorted(ctx.substate),
255c761a52db dirstate: use keyword arguments to clarify walk()'s callers
Martin von Zweigbergk <martinvonz@google.com>
parents: 34334
diff changeset
822 unknown=True, ignored=False, full=False)
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
823 for abs, st in walkresults.iteritems():
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
824 dstate = dirstate[abs]
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
825 if dstate == '?' and audit_path.check(abs):
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
826 unknown.append(abs)
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
827 elif dstate != 'r' and not st:
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
828 deleted.append(abs)
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
829 elif dstate == 'r' and st:
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
830 forgotten.append(abs)
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
831 # for finding renames
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
832 elif dstate == 'r' and not st:
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
833 removed.append(abs)
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
834 elif dstate == 'a':
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
835 added.append(abs)
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
836
23259
9f4778027bc2 addremove: add back forgotten files (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 23142
diff changeset
837 return added, unknown, deleted, removed, forgotten
19150
7a4eab2456de scmutil.addremove: factor out dirstate walk into another function
Siddharth Agarwal <sid0@fb.com>
parents: 19070
diff changeset
838
19152
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
839 def _findrenames(repo, matcher, added, removed, similarity):
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
840 '''Find renames from removed files to added ones.'''
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
841 renames = {}
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
842 if similarity > 0:
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
843 for old, new, score in similar.findrenames(repo, added, removed,
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
844 similarity):
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
845 if (repo.ui.verbose or not matcher.exact(old)
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
846 or not matcher.exact(new)):
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
847 repo.ui.status(_('recording removal of %s as rename to %s '
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
848 '(%d%% similar)\n') %
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
849 (matcher.rel(old), matcher.rel(new),
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
850 score * 100))
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
851 renames[new] = old
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
852 return renames
7a1292523db3 scmutil.addremove: factor out code to find renames
Siddharth Agarwal <sid0@fb.com>
parents: 19151
diff changeset
853
19153
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
854 def _markchanges(repo, unknown, deleted, renames):
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
855 '''Marks the files in unknown as added, the files in deleted as removed,
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
856 and the files in renames as copied.'''
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
857 wctx = repo[None]
27851
4133a306606c with: use context manager in _markchanges
Bryan O'Sullivan <bryano@fb.com>
parents: 27706
diff changeset
858 with repo.wlock():
19153
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
859 wctx.forget(deleted)
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
860 wctx.add(unknown)
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
861 for new, old in renames.iteritems():
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
862 wctx.copy(old, new)
9a4e219bda89 scmutil.addremove: factor out code to mark added/removed/renames
Siddharth Agarwal <sid0@fb.com>
parents: 19152
diff changeset
863
14320
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
864 def dirstatecopy(ui, repo, wctx, src, dst, dryrun=False, cwd=None):
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
865 """Update the dirstate to reflect the intent of copying src to dst. For
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
866 different reasons it might not end with dst being marked as copied from src.
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
867 """
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
868 origsrc = repo.dirstate.copied(src) or src
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
869 if dst == origsrc: # copying back a copy?
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
870 if repo.dirstate[dst] not in 'mn' and not dryrun:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
871 repo.dirstate.normallookup(dst)
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
872 else:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
873 if repo.dirstate[origsrc] == 'a' and origsrc == src:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
874 if not ui.quiet:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
875 ui.warn(_("%s has not been committed yet, so no copy "
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
876 "data will be stored for %s.\n")
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
877 % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd)))
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
878 if repo.dirstate[dst] in '?r' and not dryrun:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
879 wctx.add([dst])
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
880 elif not dryrun:
3438417a6657 scmutil: fold in wdutil
Matt Mackall <mpm@selenic.com>
parents: 14319
diff changeset
881 wctx.copy(origsrc, dst)
14482
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
882
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
883 def readrequires(opener, supported):
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
884 '''Reads and parses .hg/requires and checks if all entries found
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
885 are in the list of supported features.'''
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
886 requirements = set(opener.read("requires").splitlines())
14746
72e4fcb43227 requirements: show all missing features in the error message.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 14720
diff changeset
887 missings = []
14482
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
888 for r in requirements:
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
889 if r not in supported:
36346
3f98634b6572 scmutil: fix requires-file isalnum() check on first byte
Augie Fackler <augie@google.com>
parents: 36295
diff changeset
890 if not r or not r[0:1].isalnum():
14484
4582a4dd1817 requires: note apparent corruption
Matt Mackall <mpm@selenic.com>
parents: 14483
diff changeset
891 raise error.RequirementError(_(".hg/requires file is corrupt"))
14746
72e4fcb43227 requirements: show all missing features in the error message.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 14720
diff changeset
892 missings.append(r)
72e4fcb43227 requirements: show all missing features in the error message.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 14720
diff changeset
893 missings.sort()
72e4fcb43227 requirements: show all missing features in the error message.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 14720
diff changeset
894 if missings:
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16479
diff changeset
895 raise error.RequirementError(
20820
f8e531a3a77c repo: rephrase the "missing requirement" error message
Mads Kiilerich <madski@unity3d.com>
parents: 20819
diff changeset
896 _("repository requires features unknown to this Mercurial: %s")
f8e531a3a77c repo: rephrase the "missing requirement" error message
Mads Kiilerich <madski@unity3d.com>
parents: 20819
diff changeset
897 % " ".join(missings),
26421
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 26329
diff changeset
898 hint=_("see https://mercurial-scm.org/wiki/MissingRequirement"
20820
f8e531a3a77c repo: rephrase the "missing requirement" error message
Mads Kiilerich <madski@unity3d.com>
parents: 20819
diff changeset
899 " for more information"))
14482
58b36e9ea783 introduce new function scmutil.readrequires
Adrian Buehlmann <adrian@cadifra.com>
parents: 14435
diff changeset
900 return requirements
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
901
24934
5abd0a76bc8f requires: move requires file writing func from localrepo to scmutil
Drew Gottlieb <drgott@google.com>
parents: 24755
diff changeset
902 def writerequires(opener, requirements):
27706
22e362da27cf scmutil: use context managers for file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27651
diff changeset
903 with opener('requires', 'w') as fp:
22e362da27cf scmutil: use context managers for file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27651
diff changeset
904 for r in sorted(requirements):
22e362da27cf scmutil: use context managers for file handles
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27651
diff changeset
905 fp.write("%s\n" % r)
24934
5abd0a76bc8f requires: move requires file writing func from localrepo to scmutil
Drew Gottlieb <drgott@google.com>
parents: 24755
diff changeset
906
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
907 class filecachesubentry(object):
20042
9a72d3886888 scmutil.filecacheentry: make stat argument to constructor mandatory
Siddharth Agarwal <sid0@fb.com>
parents: 20033
diff changeset
908 def __init__(self, path, stat):
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
909 self.path = path
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
910 self.cachestat = None
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
911 self._cacheable = None
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
912
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
913 if stat:
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
914 self.cachestat = filecachesubentry.stat(self.path)
18315
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
915
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
916 if self.cachestat:
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
917 self._cacheable = self.cachestat.cacheable()
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
918 else:
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
919 # None means we don't know yet
216230643ae2 filecache: allow filecacheentry to be created without stating in __init__
Idan Kamara <idankk86@gmail.com>
parents: 18213
diff changeset
920 self._cacheable = None
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
921
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
922 def refresh(self):
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
923 if self.cacheable():
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
924 self.cachestat = filecachesubentry.stat(self.path)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
925
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
926 def cacheable(self):
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
927 if self._cacheable is not None:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
928 return self._cacheable
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
929
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
930 # we don't know yet, assume it is for now
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
931 return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
932
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
933 def changed(self):
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
934 # no point in going further if we can't cache it
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
935 if not self.cacheable():
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
936 return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
937
20043
88bd8df008f2 scmutil: rename filecacheentry to filecachesubentry
Siddharth Agarwal <sid0@fb.com>
parents: 20042
diff changeset
938 newstat = filecachesubentry.stat(self.path)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
939
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
940 # we may not know if it's cacheable yet, check again now
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
941 if newstat and self._cacheable is None:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
942 self._cacheable = newstat.cacheable()
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
943
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
944 # check again
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
945 if not self._cacheable:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
946 return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
947
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
948 if self.cachestat != newstat:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
949 self.cachestat = newstat
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
950 return True
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
951 else:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
952 return False
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
953
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
954 @staticmethod
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
955 def stat(path):
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
956 try:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
957 return util.cachestat(path)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25658
diff changeset
958 except OSError as e:
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
959 if e.errno != errno.ENOENT:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
960 raise
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
961
20044
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
962 class filecacheentry(object):
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
963 def __init__(self, paths, stat=True):
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
964 self._entries = []
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
965 for path in paths:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
966 self._entries.append(filecachesubentry(path, stat))
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
967
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
968 def changed(self):
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
969 '''true if any entry has changed'''
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
970 for entry in self._entries:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
971 if entry.changed():
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
972 return True
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
973 return False
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
974
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
975 def refresh(self):
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
976 for entry in self._entries:
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
977 entry.refresh()
d38de18d187a scmutil: introduce a filecacheentry that can watch multiple paths
Siddharth Agarwal <sid0@fb.com>
parents: 20043
diff changeset
978
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
979 class filecache(object):
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
980 '''A property like decorator that tracks files under .hg/ for updates.
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
981
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
982 Records stat info when called in _filecache.
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
983
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
984 On subsequent calls, compares old stat info with new info, and recreates the
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
985 object when any of the files changes, updating the new stat info in
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
986 _filecache.
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
987
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
988 Mercurial either atomic renames or appends for files under .hg,
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
989 so to ensure the cache is reliable we need the filesystem to be able
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
990 to tell us if a file has been replaced. If it can't, we fallback to
26098
ce26928cbe41 spelling: behaviour -> behavior
timeless@mozdev.org
parents: 26020
diff changeset
991 recreating the object on every call (essentially the same behavior as
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
992 propertycache).
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
993
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
994 '''
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
995 def __init__(self, *paths):
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
996 self.paths = paths
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
997
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
998 def join(self, obj, fname):
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
999 """Used to compute the runtime path of a cached file.
16198
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1000
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1001 Users should subclass filecache and provide their own version of this
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1002 function to call the appropriate join function on 'obj' (an instance
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1003 of the class that its member function was decorated).
fa8488565afd filecache: refactor path join logic to a function
Idan Kamara <idankk86@gmail.com>
parents: 16115
diff changeset
1004 """
31294
1937671105bc filecache: make 'join' abstract
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31227
diff changeset
1005 raise NotImplementedError
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1006
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1007 def __call__(self, func):
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1008 self.func = func
31428
1fc3d1f02865 scmutil: make function name bytes in class filecache
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31358
diff changeset
1009 self.name = func.__name__.encode('ascii')
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1010 return self
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1011
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1012 def __get__(self, obj, type=None):
29373
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
1013 # if accessed on the class, return the descriptor itself.
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
1014 if obj is None:
36fbd72c2f39 scmutil: allow access to filecache descriptor on class
Martijn Pieters <mjpieters@fb.com>
parents: 29367
diff changeset
1015 return self
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1016 # do we need to check if the file changed?
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1017 if self.name in obj.__dict__:
18316
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1018 assert self.name in obj._filecache, self.name
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1019 return obj.__dict__[self.name]
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1020
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1021 entry = obj._filecache.get(self.name)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1022
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1023 if entry:
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1024 if entry.changed():
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1025 entry.obj = self.func(obj)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1026 else:
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1027 paths = [self.join(obj, path) for path in self.paths]
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1028
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1029 # We stat -before- creating the object so our cache doesn't lie if
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1030 # a writer modified between the time we read and stat
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1031 entry = filecacheentry(paths, True)
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1032 entry.obj = self.func(obj)
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1033
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1034 obj._filecache[self.name] = entry
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1035
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1036 obj.__dict__[self.name] = entry.obj
14928
dca59d5be12d scmutil: introduce filecache
Idan Kamara <idankk86@gmail.com>
parents: 14861
diff changeset
1037 return entry.obj
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1038
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1039 def __set__(self, obj, value):
18316
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1040 if self.name not in obj._filecache:
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1041 # we add an entry for the missing value because X in __dict__
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1042 # implies X in _filecache
20045
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1043 paths = [self.join(obj, path) for path in self.paths]
b3684fd2ff1a scmutil.filecache: support watching over multiple files
Siddharth Agarwal <sid0@fb.com>
parents: 20044
diff changeset
1044 ce = filecacheentry(paths, False)
18316
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1045 obj._filecache[self.name] = ce
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1046 else:
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1047 ce = obj._filecache[self.name]
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1048
f36375576ed5 filecache: create an entry in _filecache when __set__ is called for a missing one
Idan Kamara <idankk86@gmail.com>
parents: 18315
diff changeset
1049 ce.obj = value # update cached copy
16115
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1050 obj.__dict__[self.name] = value # update copy returned by obj.x
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1051
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1052 def __delete__(self, obj):
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1053 try:
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1054 del obj.__dict__[self.name]
236bb604dc39 scmutil: update cached copy when filecached attribute is assigned (issue3263)
Idan Kamara <idankk86@gmail.com>
parents: 16068
diff changeset
1055 except KeyError:
18177
203b7a759218 scmutil: clean up use of two-argument raise
Augie Fackler <raf@durin42.com>
parents: 17992
diff changeset
1056 raise AttributeError(self.name)
26490
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1057
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1058 def extdatasource(repo, source):
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1059 """Gather a map of rev -> value dict from the specified source
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1060
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1061 A source spec is treated as a URL, with a special case shell: type
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1062 for parsing the output from a shell command.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1063
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1064 The data is parsed as a series of newline-separated records where
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1065 each record is a revision specifier optionally followed by a space
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1066 and a freeform string value. If the revision is known locally, it
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1067 is converted to a rev, otherwise the record is skipped.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1068
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1069 Note that both key and value are treated as UTF-8 and converted to
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1070 the local encoding. This allows uniformity between local and
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1071 remote data sources.
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1072 """
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1073
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1074 spec = repo.ui.config("extdata", source)
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1075 if not spec:
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1076 raise error.Abort(_("unknown extdata source '%s'") % source)
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1077
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1078 data = {}
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1079 src = proc = None
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1080 try:
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1081 if spec.startswith("shell:"):
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1082 # external commands should be run relative to the repo root
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1083 cmd = spec[6:]
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1084 proc = subprocess.Popen(cmd, shell=True, bufsize=-1,
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1085 close_fds=util.closefds,
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1086 stdout=subprocess.PIPE, cwd=repo.root)
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1087 src = proc.stdout
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1088 else:
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1089 # treat as a URL or file
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1090 src = url.open(repo.ui, spec)
34461
910adadf08e8 extdata: just use iterator to read lines one by one
Yuya Nishihara <yuya@tcha.org>
parents: 34460
diff changeset
1091 for l in src:
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1092 if " " in l:
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1093 k, v = l.strip().split(" ", 1)
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1094 else:
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1095 k, v = l.strip(), ""
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1096
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1097 k = encoding.tolocal(k)
34460
d5c5cc767b7e extdata: ignore ambiguous identifier as well
Yuya Nishihara <yuya@tcha.org>
parents: 34457
diff changeset
1098 try:
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1099 data[repo[k].rev()] = encoding.tolocal(v)
34460
d5c5cc767b7e extdata: ignore ambiguous identifier as well
Yuya Nishihara <yuya@tcha.org>
parents: 34457
diff changeset
1100 except (error.LookupError, error.RepoLookupError):
d5c5cc767b7e extdata: ignore ambiguous identifier as well
Yuya Nishihara <yuya@tcha.org>
parents: 34457
diff changeset
1101 pass # we ignore data for nodes that don't exist locally
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1102 finally:
34462
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1103 if proc:
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1104 proc.communicate()
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1105 if src:
c67db5dc131d extdata: use subprocess so we don't have to chdir() manually
Yuya Nishihara <yuya@tcha.org>
parents: 34461
diff changeset
1106 src.close()
35419
b1959391a088 extdata: abort if external command exits with non-zero status (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 35317
diff changeset
1107 if proc and proc.returncode != 0:
b1959391a088 extdata: abort if external command exits with non-zero status (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 35317
diff changeset
1108 raise error.Abort(_("extdata command '%s' failed: %s")
b1959391a088 extdata: abort if external command exits with non-zero status (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 35317
diff changeset
1109 % (cmd, util.explainexit(proc.returncode)[0]))
34457
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1110
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1111 return data
7757cc48b766 extdata: add extdatasource reader
Matt Mackall <mpm@selenic.com>
parents: 34368
diff changeset
1112
26490
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1113 def _locksub(repo, lock, envvar, cmd, environ=None, *args, **kwargs):
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1114 if lock is None:
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1115 raise error.LockInheritanceContractViolation(
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1116 'lock can only be inherited while held')
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1117 if environ is None:
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1118 environ = {}
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1119 with lock.inherit() as locker:
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1120 environ[envvar] = locker
f0d730efb02f scmutil: add a way for a subprocess to be run with an inheritable lock
Siddharth Agarwal <sid0@fb.com>
parents: 26433
diff changeset
1121 return repo.ui.system(cmd, environ=environ, *args, **kwargs)
26491
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1122
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1123 def wlocksub(repo, cmd, *args, **kwargs):
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1124 """run cmd as a subprocess that allows inheriting repo's wlock
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1125
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1126 This can only be called while the wlock is held. This takes all the
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1127 arguments that ui.system does, and returns the exit code of the
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1128 subprocess."""
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1129 return _locksub(repo, repo.currentwlock(), 'HG_WLOCK_LOCKER', cmd, *args,
366d489295ca scmutil: add a way for a repo's wlock to be inherited by a subprocess
Siddharth Agarwal <sid0@fb.com>
parents: 26490
diff changeset
1130 **kwargs)
26906
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
1131
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
1132 def gdinitconfig(ui):
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
1133 """helper function to know if a repo should be created as general delta
26907
dfab6edb98e3 format: introduce 'format.usegeneraldelta`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26906
diff changeset
1134 """
dfab6edb98e3 format: introduce 'format.usegeneraldelta`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26906
diff changeset
1135 # experimental config: format.generaldelta
33238
784f2bd96d43 configitems: register the 'format.generaldelta' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33100
diff changeset
1136 return (ui.configbool('format', 'generaldelta')
33246
4d9458e06ef0 configitems: register the 'format.usegeneraldelta' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33238
diff changeset
1137 or ui.configbool('format', 'usegeneraldelta'))
26906
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
1138
26907
dfab6edb98e3 format: introduce 'format.usegeneraldelta`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26906
diff changeset
1139 def gddeltaconfig(ui):
dfab6edb98e3 format: introduce 'format.usegeneraldelta`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26906
diff changeset
1140 """helper function to know if incoming delta should be optimised
dfab6edb98e3 format: introduce 'format.usegeneraldelta`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26906
diff changeset
1141 """
26906
e40af07e518e scmutil: extract general delta config handling in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26836
diff changeset
1142 # experimental config: format.generaldelta
33238
784f2bd96d43 configitems: register the 'format.generaldelta' config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33100
diff changeset
1143 return ui.configbool('format', 'generaldelta')
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1144
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1145 class simplekeyvaluefile(object):
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1146 """A simple file with key=value lines
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1147
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1148 Keys must be alphanumerics and start with a letter, values must not
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1149 contain '\n' characters"""
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1150 firstlinekey = '__firstline'
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1151
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1152 def __init__(self, vfs, path, keys=None):
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1153 self.vfs = vfs
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1154 self.path = path
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1155
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1156 def read(self, firstlinenonkeyval=False):
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1157 """Read the contents of a simple key-value file
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1158
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1159 'firstlinenonkeyval' indicates whether the first line of file should
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1160 be treated as a key-value pair or reuturned fully under the
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1161 __firstline key."""
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1162 lines = self.vfs.readlines(self.path)
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1163 d = {}
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1164 if firstlinenonkeyval:
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1165 if not lines:
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1166 e = _("empty simplekeyvalue file")
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1167 raise error.CorruptedState(e)
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1168 # we don't want to include '\n' in the __firstline
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1169 d[self.firstlinekey] = lines[0][:-1]
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1170 del lines[0]
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1171
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1172 try:
32309
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32221
diff changeset
1173 # the 'if line.strip()' part prevents us from failing on empty
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32221
diff changeset
1174 # lines which only contain '\n' therefore are not skipped
ed2c44741190 scmutil: add simplekeyvaluefile reading test
Kostia Balytskyi <ikostia@fb.com>
parents: 32221
diff changeset
1175 # by 'if line'
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1176 updatedict = dict(line[:-1].split('=', 1) for line in lines
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1177 if line.strip())
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1178 if self.firstlinekey in updatedict:
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1179 e = _("%r can't be used as a key")
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1180 raise error.CorruptedState(e % self.firstlinekey)
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1181 d.update(updatedict)
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1182 except ValueError as e:
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1183 raise error.CorruptedState(str(e))
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1184 return d
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1185
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1186 def write(self, data, firstline=None):
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1187 """Write key=>value mapping to a file
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1188 data is a dict. Keys must be alphanumerical and start with a letter.
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1189 Values must not contain newline characters.
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1190
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1191 If 'firstline' is not None, it is written to file before
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1192 everything else, as it is, not in a key=value form"""
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1193 lines = []
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1194 if firstline is not None:
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1195 lines.append('%s\n' % firstline)
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1196
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1197 for k, v in data.items():
32310
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1198 if k == self.firstlinekey:
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1199 e = "key name '%s' is reserved" % self.firstlinekey
218ca8526ec0 scmutil: make simplekeyvaluefile able to have a non-key-value first line
Kostia Balytskyi <ikostia@fb.com>
parents: 32309
diff changeset
1200 raise error.ProgrammingError(e)
35953
558e01a23f40 py3: slice on bytes to prevent getting the ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35928
diff changeset
1201 if not k[0:1].isalpha():
31559
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1202 e = "keys must start with a letter in a key-value file"
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1203 raise error.ProgrammingError(e)
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1204 if not k.isalnum():
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1205 e = "invalid key name in a simple key-value file"
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1206 raise error.ProgrammingError(e)
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1207 if '\n' in v:
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1208 e = "invalid value in a simple key-value file"
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1209 raise error.ProgrammingError(e)
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1210 lines.append("%s=%s\n" % (k, v))
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1211 with self.vfs(self.path, mode='wb', atomictemp=True) as fp:
56acc4250900 scmutil: add a simple key-value file helper
Kostia Balytskyi <ikostia@fb.com>
parents: 31428
diff changeset
1212 fp.write(''.join(lines))
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
1213
33541
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
1214 _reportobsoletedsource = [
33542
b11e8c67fb0f debugobsolete: also report the number of obsoleted changesets
Boris Feld <boris.feld@octobus.net>
parents: 33541
diff changeset
1215 'debugobsolete',
33541
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
1216 'pull',
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
1217 'push',
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
1218 'serve',
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
1219 'unbundle',
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
1220 ]
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
1221
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1222 _reportnewcssource = [
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1223 'pull',
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1224 'unbundle',
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1225 ]
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1226
36175
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35953
diff changeset
1227 # a list of (repo, ctx, files) functions called by various commands to allow
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35953
diff changeset
1228 # extensions to ensure the corresponding files are available locally, before the
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35953
diff changeset
1229 # command uses them.
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35953
diff changeset
1230 fileprefetchhooks = util.hooks()
f52a9336ac5f cmdutil: convert the prefetchfiles() hook to a callback mechanism (API)
Matt Harbison <matt_harbison@yahoo.com>
parents: 35953
diff changeset
1231
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1232 # A marker that tells the evolve extension to suppress its own reporting
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1233 _reportstroubledchangesets = True
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1234
33541
b47fef6d2365 transaction-summary: display the summary for all transactions
Boris Feld <boris.feld@octobus.net>
parents: 33511
diff changeset
1235 def registersummarycallback(repo, otr, txnname=''):
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
1236 """register a callback to issue a summary after the transaction is closed
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33246
diff changeset
1237 """
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
1238 def txmatch(sources):
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
1239 return any(txnname.startswith(source) for source in sources)
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
1240
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1241 categories = []
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1242
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1243 def reportsummary(func):
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1244 """decorator for report callbacks."""
34987
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1245 # The repoview life cycle is shorter than the one of the actual
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1246 # underlying repository. So the filtered object can die before the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1247 # weakref is used leading to troubles. We keep a reference to the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1248 # unfiltered object and restore the filtering when retrieving the
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1249 # repository through the weakref.
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1250 filtername = repo.filtername
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1251 reporef = weakref.ref(repo.unfiltered())
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1252 def wrapped(tr):
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
1253 repo = reporef()
34987
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1254 if filtername:
96dcc78468e3 tr-summary: keep a weakref to the unfiltered repository
Boris Feld <boris.feld@octobus.net>
parents: 34972
diff changeset
1255 repo = repo.filtered(filtername)
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1256 func(repo, tr)
35748
963a611b2f39 scmutil: 0-pad transaction report callback category
Martin von Zweigbergk <martinvonz@google.com>
parents: 35710
diff changeset
1257 newcat = '%02i-txnreport' % len(categories)
34620
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1258 otr.addpostclose(newcat, wrapped)
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1259 categories.append(newcat)
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1260 return wrapped
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1261
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1262 if txmatch(_reportobsoletedsource):
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1263 @reportsummary
b799f11644d8 scmutil: factor out building of transaction summary callback
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34619
diff changeset
1264 def reportobsoleted(repo, tr):
34619
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
1265 obsoleted = obsutil.getobsoleted(repo, tr)
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
1266 if obsoleted:
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
1267 repo.ui.status(_('obsoleted %i changesets\n')
18309380fb88 scmutil: factor out transaction name lookup in registersummarycallback()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34543
diff changeset
1268 % len(obsoleted))
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1269
35710
5cd60b0587a8 evolution: make reporting of new unstable changesets optional
Martin von Zweigbergk <martinvonz@google.com>
parents: 35709
diff changeset
1270 if (obsolete.isenabled(repo, obsolete.createmarkersopt) and
5cd60b0587a8 evolution: make reporting of new unstable changesets optional
Martin von Zweigbergk <martinvonz@google.com>
parents: 35709
diff changeset
1271 repo.ui.configbool('experimental', 'evolution.report-instabilities')):
35709
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1272 instabilitytypes = [
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1273 ('orphan', 'orphan'),
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1274 ('phase-divergent', 'phasedivergent'),
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1275 ('content-divergent', 'contentdivergent'),
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1276 ]
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1277
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1278 def getinstabilitycounts(repo):
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1279 filtered = repo.changelog.filteredrevs
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1280 counts = {}
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1281 for instability, revset in instabilitytypes:
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1282 counts[instability] = len(set(obsolete.getrevs(repo, revset)) -
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1283 filtered)
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1284 return counts
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1285
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1286 oldinstabilitycounts = getinstabilitycounts(repo)
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1287 @reportsummary
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1288 def reportnewinstabilities(repo, tr):
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1289 newinstabilitycounts = getinstabilitycounts(repo)
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1290 for instability, revset in instabilitytypes:
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1291 delta = (newinstabilitycounts[instability] -
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1292 oldinstabilitycounts[instability])
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1293 if delta > 0:
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1294 repo.ui.warn(_('%i new %s changesets\n') %
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1295 (delta, instability))
1a09dad8b85a evolution: report new unstable changesets
Martin von Zweigbergk <martinvonz@google.com>
parents: 35503
diff changeset
1296
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1297 if txmatch(_reportnewcssource):
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1298 @reportsummary
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1299 def reportnewcs(repo, tr):
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1300 """Report the range of new revisions pulled/unbundled."""
35317
137a08d82232 transaction: build changes['revs'] as range instead of a set
Joerg Sonnenberger <joerg@bec.de>
parents: 35216
diff changeset
1301 newrevs = tr.changes.get('revs', xrange(0, 0))
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1302 if not newrevs:
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1303 return
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1304
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1305 # Compute the bounds of new revisions' range, excluding obsoletes.
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1306 unfi = repo.unfiltered()
34737
0c06875e7755 transaction-summary: use a revset to filter obsoletes in reportnewcs()
Denis Laxalde <denis@laxalde.org>
parents: 34661
diff changeset
1307 revs = unfi.revs('%ld and not obsolete()', newrevs)
0c06875e7755 transaction-summary: use a revset to filter obsoletes in reportnewcs()
Denis Laxalde <denis@laxalde.org>
parents: 34661
diff changeset
1308 if not revs:
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1309 # Got only obsoletes.
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1310 return
34737
0c06875e7755 transaction-summary: use a revset to filter obsoletes in reportnewcs()
Denis Laxalde <denis@laxalde.org>
parents: 34661
diff changeset
1311 minrev, maxrev = repo[revs.min()], repo[revs.max()]
34661
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1312
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1313 if minrev == maxrev:
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1314 revrange = minrev
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1315 else:
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1316 revrange = '%s:%s' % (minrev, maxrev)
eb586ed5d8ce transaction-summary: show the range of new revisions upon pull/unbundle (BC)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34645
diff changeset
1317 repo.ui.status(_('new changesets %s\n') % revrange)
35188
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
1318
35195
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35188
diff changeset
1319 def nodesummaries(repo, nodes, maxnumnodes=4):
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35188
diff changeset
1320 if len(nodes) <= maxnumnodes or repo.ui.verbose:
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35188
diff changeset
1321 return ' '.join(short(h) for h in nodes)
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35188
diff changeset
1322 first = ' '.join(short(h) for h in nodes[:maxnumnodes])
35216
278f1feee73a scmutil: improve format pattern used in nodesummaries
Boris Feld <boris.feld@octobus.net>
parents: 35196
diff changeset
1323 return _("%s and %d others") % (first, len(nodes) - maxnumnodes)
35195
bc775b8cc020 scmutil: extra utility to display a reasonable amount of nodes
Boris Feld <boris.feld@octobus.net>
parents: 35188
diff changeset
1324
35196
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1325 def enforcesinglehead(repo, tr, desc):
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1326 """check that no named branch has multiple heads"""
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1327 if desc in ('strip', 'repair'):
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1328 # skip the logic during strip
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1329 return
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1330 visible = repo.filtered('visible')
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1331 # possible improvement: we could restrict the check to affected branch
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1332 for name, heads in visible.branchmap().iteritems():
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1333 if len(heads) > 1:
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1334 msg = _('rejecting multiple heads on branch "%s"')
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1335 msg %= name
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1336 hint = _('%d heads: %s')
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1337 hint %= (len(heads), nodesummaries(repo, heads))
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1338 raise error.Abort(msg, hint=hint)
66ecde8a704d server: introduce a 'experimental.single-head-per-branch' option
Boris Feld <boris.feld@octobus.net>
parents: 35195
diff changeset
1339
35188
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
1340 def wrapconvertsink(sink):
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
1341 """Allow extensions to wrap the sink returned by convcmd.convertsink()
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
1342 before it is used, whether or not the convert extension was formally loaded.
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
1343 """
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 34987
diff changeset
1344 return sink
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1345
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1346 def unhidehashlikerevs(repo, specs, hiddentype):
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1347 """parse the user specs and unhide changesets whose hash or revision number
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1348 is passed.
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1349
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1350 hiddentype can be: 1) 'warn': warn while unhiding changesets
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1351 2) 'nowarn': don't warn while unhiding changesets
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1352
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1353 returns a repo object with the required changesets unhidden
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1354 """
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1355 if not repo.filtername or not repo.ui.configbool('experimental',
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1356 'directaccess'):
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1357 return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1358
35503
b55a142f00c5 scmutil: use a tuple of possible values instead of using startswith()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35500
diff changeset
1359 if repo.filtername not in ('visible', 'visible-hidden'):
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1360 return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1361
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1362 symbols = set()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1363 for spec in specs:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1364 try:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1365 tree = revsetlang.parse(spec)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1366 except error.ParseError: # will be reported by scmutil.revrange()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1367 continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1368
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1369 symbols.update(revsetlang.gethashlikesymbols(tree))
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1370
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1371 if not symbols:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1372 return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1373
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1374 revs = _getrevsfromsymbols(repo, symbols)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1375
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1376 if not revs:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1377 return repo
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1378
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1379 if hiddentype == 'warn':
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1380 unfi = repo.unfiltered()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1381 revstr = ", ".join([pycompat.bytestr(unfi[l]) for l in revs])
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1382 repo.ui.warn(_("warning: accessing hidden changesets for write "
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1383 "operation: %s\n") % revstr)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1384
35503
b55a142f00c5 scmutil: use a tuple of possible values instead of using startswith()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35500
diff changeset
1385 # we have to use new filtername to separate branch/tags cache until we can
b55a142f00c5 scmutil: use a tuple of possible values instead of using startswith()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35500
diff changeset
1386 # disbale these cache when revisions are dynamically pinned.
35500
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1387 return repo.filtered('visible-hidden', revs)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1388
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1389 def _getrevsfromsymbols(repo, symbols):
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1390 """parse the list of symbols and returns a set of revision numbers of hidden
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1391 changesets present in symbols"""
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1392 revs = set()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1393 unfi = repo.unfiltered()
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1394 unficl = unfi.changelog
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1395 cl = repo.changelog
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1396 tiprev = len(unficl)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1397 pmatch = unficl._partialmatch
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1398 allowrevnums = repo.ui.configbool('experimental', 'directaccess.revnums')
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1399 for s in symbols:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1400 try:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1401 n = int(s)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1402 if n <= tiprev:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1403 if not allowrevnums:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1404 continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1405 else:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1406 if n not in cl:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1407 revs.add(n)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1408 continue
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1409 except ValueError:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1410 pass
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1411
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1412 try:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1413 s = pmatch(s)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1414 except error.LookupError:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1415 s = None
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1416
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1417 if s is not None:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1418 rev = unficl.rev(s)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1419 if rev not in cl:
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1420 revs.add(rev)
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1421
8bb90cc4668e scmutil: add utility fn to return repo object with user passed revs unhidden
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35419
diff changeset
1422 return revs