--- a/.hgsigs Sun Jan 08 13:54:36 2012 +0400
+++ b/.hgsigs Mon Jan 09 20:17:37 2012 -0600
@@ -46,3 +46,4 @@
384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI=
41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4=
195dbd1cef0c2f9f8bcf4ea303238105f716bda3 0 iD8DBQBO1/fWywK+sNU5EO8RAmoPAKCR5lpv1D6JLURHD8KVLSV4GRVEBgCgnd0Sy78ligNfqAMafmACRDvj7vo=
+6344043924497cd06d781d9014c66802285072e4 0 iD8DBQBPALgmywK+sNU5EO8RAlfhAJ9nYOdWnhfVDHYtDTJAyJtXBAQS9wCgnefoSQt7QABkbGxM+Q85UYEBuD0=
--- a/.hgtags Sun Jan 08 13:54:36 2012 +0400
+++ b/.hgtags Mon Jan 09 20:17:37 2012 -0600
@@ -58,3 +58,4 @@
384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc
41453d55b481ddfcc1dacb445179649e24ca861d 2.0
195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1
+6344043924497cd06d781d9014c66802285072e4 2.0.2
--- a/contrib/mercurial.el Sun Jan 08 13:54:36 2012 +0400
+++ b/contrib/mercurial.el Mon Jan 09 20:17:37 2012 -0600
@@ -15,8 +15,7 @@
;; You should have received a copy of the GNU General Public License
;; along with mercurial.el, GNU Emacs, or XEmacs; see the file COPYING
-;; (`C-h C-l'). If not, write to the Free Software Foundation, Inc.,
-;; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+;; (`C-h C-l'). If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
--- a/contrib/mq.el Sun Jan 08 13:54:36 2012 +0400
+++ b/contrib/mq.el Mon Jan 09 20:17:37 2012 -0600
@@ -15,8 +15,7 @@
;; You should have received a copy of the GNU General Public License
;; along with mq.el, GNU Emacs, or XEmacs; see the file COPYING (`C-h
-;; C-l'). If not, write to the Free Software Foundation, Inc., 59
-;; Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+;; C-l'). If not, see <http://www.gnu.org/licenses/>.
(eval-when-compile (require 'cl))
(require 'mercurial)
Binary file contrib/wix/COPYING.rtf has changed
--- a/contrib/wix/guids.wxi Sun Jan 08 13:54:36 2012 +0400
+++ b/contrib/wix/guids.wxi Mon Jan 09 20:17:37 2012 -0600
@@ -24,7 +24,7 @@
<?define i18nFolder.guid = {EADFA693-A0B5-4f31-87C9-3997CFAC1B42} ?>
<!-- templates.wxs -->
- <?define templates.root.guid = {111509CB-4C96-4035-80BC-F66A99CD5ACB} ?>
+ <?define templates.root.guid = {8DF97574-33E9-412F-8414-65B48BB18783} ?>
<?define templates.atom.guid = {AB5D2908-BC95-44BE-9D79-069EF43D93E2} ?>
<?define templates.coal.guid = {B63CCAAB-4EAF-43b4-901E-4BD13F5B78FC} ?>
<?define templates.gitweb.guid = {6A33D168-F84E-45AA-912C-23CAC2D66BCA} ?>
--- a/contrib/wix/templates.wxs Sun Jan 08 13:54:36 2012 +0400
+++ b/contrib/wix/templates.wxs Mon Jan 09 20:17:37 2012 -0600
@@ -31,6 +31,7 @@
<File Name="map-cmdline.changelog" KeyPath="yes" />
<File Name="map-cmdline.compact" />
<File Name="map-cmdline.default" />
+ <File Name="map-cmdline.bisect" />
<File Name="map-cmdline.xml" />
<File Name="template-vars.txt" />
</Component>
--- a/hgext/color.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/color.py Mon Jan 09 20:17:37 2012 -0600
@@ -2,19 +2,8 @@
#
# Copyright (C) 2007 Kevin Christen <kevin.christen@gmail.com>
#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
'''colorize output from some commands
--- a/hgext/convert/common.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/convert/common.py Mon Jan 09 20:17:37 2012 -0600
@@ -339,7 +339,7 @@
# Since ARG_MAX is for command line _and_ environment, lower our limit
# (and make happy Windows shells while doing this).
- return argmax / 2 - 1
+ return argmax // 2 - 1
def limit_arglist(self, arglist, cmd, closestdin, *args, **kwargs):
cmdlen = len(self._cmdline(cmd, closestdin, *args, **kwargs))
--- a/hgext/convert/cvsps.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/convert/cvsps.py Mon Jan 09 20:17:37 2012 -0600
@@ -556,27 +556,25 @@
# Sort files in each changeset
+ def entitycompare(l, r):
+ 'Mimic cvsps sorting order'
+ l = l.file.split('/')
+ r = r.file.split('/')
+ nl = len(l)
+ nr = len(r)
+ n = min(nl, nr)
+ for i in range(n):
+ if i + 1 == nl and nl < nr:
+ return -1
+ elif i + 1 == nr and nl > nr:
+ return +1
+ elif l[i] < r[i]:
+ return -1
+ elif l[i] > r[i]:
+ return +1
+ return 0
+
for c in changesets:
- def pathcompare(l, r):
- 'Mimic cvsps sorting order'
- l = l.split('/')
- r = r.split('/')
- nl = len(l)
- nr = len(r)
- n = min(nl, nr)
- for i in range(n):
- if i + 1 == nl and nl < nr:
- return -1
- elif i + 1 == nr and nl > nr:
- return +1
- elif l[i] < r[i]:
- return -1
- elif l[i] > r[i]:
- return +1
- return 0
- def entitycompare(l, r):
- return pathcompare(l.file, r.file)
-
c.entries.sort(entitycompare)
# Sort changesets by date
--- a/hgext/convert/subversion.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/convert/subversion.py Mon Jan 09 20:17:37 2012 -0600
@@ -106,11 +106,11 @@
discover_changed_paths,
strict_node_history,
receiver)
- except SubversionException, (inst, num):
- pickle.dump(num, fp, protocol)
except IOError:
# Caller may interrupt the iteration
pickle.dump(None, fp, protocol)
+ except Exception, inst:
+ pickle.dump(str(inst), fp, protocol)
else:
pickle.dump(None, fp, protocol)
fp.close()
@@ -145,7 +145,7 @@
except:
if entry is None:
break
- raise SubversionException("child raised exception", entry)
+ raise util.Abort(_("log stream exception '%s'") % entry)
yield entry
def close(self):
--- a/hgext/convert/transport.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/convert/transport.py Mon Jan 09 20:17:37 2012 -0600
@@ -15,8 +15,7 @@
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
from mercurial import util
from svn.core import SubversionException, Pool
--- a/hgext/fetch.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/fetch.py Mon Jan 09 20:17:37 2012 -0600
@@ -83,7 +83,7 @@
# Is this a simple fast-forward along the current branch?
newheads = repo.branchheads(branch)
newchildren = repo.changelog.nodesbetween([parent], newheads)[2]
- if len(newheads) == 1:
+ if len(newheads) == 1 and len(newchildren):
if newchildren[0] != parent:
return hg.clean(repo, newchildren[0])
else:
@@ -102,6 +102,9 @@
(len(newheads) - 1))
return 1
+ if not newheads:
+ return 0
+
# Otherwise, let's merge.
err = False
if newheads:
--- a/hgext/hgcia.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/hgcia.py Mon Jan 09 20:17:37 2012 -0600
@@ -113,7 +113,7 @@
# diffstat is stupid
self.name = 'cia'
def write(self, data):
- self.lines.append(data)
+ self.lines += data.splitlines(True)
def close(self):
pass
--- a/hgext/largefiles/lfcommands.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/largefiles/lfcommands.py Mon Jan 09 20:17:37 2012 -0600
@@ -455,7 +455,13 @@
ret = -1
state = repo.dirstate[lfutil.standin(lfile)]
if state == 'n':
- lfdirstate.normal(lfile)
+ # When rebasing, we need to synchronize the standin and the largefile,
+ # because otherwise the largefile will get reverted. But for commit's
+ # sake, we have to mark the file as unclean.
+ if getattr(repo, "_isrebasing", False):
+ lfdirstate.normallookup(lfile)
+ else:
+ lfdirstate.normal(lfile)
elif state == 'r':
lfdirstate.remove(lfile)
elif state == 'a':
--- a/hgext/largefiles/lfutil.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/largefiles/lfutil.py Mon Jan 09 20:17:37 2012 -0600
@@ -139,6 +139,8 @@
return super(largefiles_dirstate, self).drop(unixpath(f))
def forget(self, f):
return super(largefiles_dirstate, self).forget(unixpath(f))
+ def normallookup(self, f):
+ return super(largefiles_dirstate, self).normallookup(unixpath(f))
def openlfdirstate(ui, repo):
'''
@@ -152,11 +154,7 @@
# If the largefiles dirstate does not exist, populate and create
# it. This ensures that we create it on the first meaningful
- # largefiles operation in a new clone. It also gives us an easy
- # way to forcibly rebuild largefiles state:
- # rm .hg/largefiles/dirstate && hg status
- # Or even, if things are really messed up:
- # rm -rf .hg/largefiles && hg status
+ # largefiles operation in a new clone.
if not os.path.exists(os.path.join(admin, 'dirstate')):
util.makedirs(admin)
matcher = getstandinmatcher(repo)
@@ -170,27 +168,19 @@
except OSError, err:
if err.errno != errno.ENOENT:
raise
-
- lfdirstate.write()
-
return lfdirstate
def lfdirstate_status(lfdirstate, repo, rev):
- wlock = repo.wlock()
- try:
- match = match_.always(repo.root, repo.getcwd())
- s = lfdirstate.status(match, [], False, False, False)
- unsure, modified, added, removed, missing, unknown, ignored, clean = s
- for lfile in unsure:
- if repo[rev][standin(lfile)].data().strip() != \
- hashfile(repo.wjoin(lfile)):
- modified.append(lfile)
- else:
- clean.append(lfile)
- lfdirstate.normal(lfile)
- lfdirstate.write()
- finally:
- wlock.release()
+ match = match_.always(repo.root, repo.getcwd())
+ s = lfdirstate.status(match, [], False, False, False)
+ unsure, modified, added, removed, missing, unknown, ignored, clean = s
+ for lfile in unsure:
+ if repo[rev][standin(lfile)].data().strip() != \
+ hashfile(repo.wjoin(lfile)):
+ modified.append(lfile)
+ else:
+ clean.append(lfile)
+ lfdirstate.normal(lfile)
return (modified, added, removed, missing, unknown, ignored, clean)
def listlfiles(repo, rev=None, matcher=None):
@@ -232,6 +222,16 @@
return
copytostoreabsolute(repo, repo.wjoin(file), hash)
+def copyalltostore(repo, node):
+ '''Copy all largefiles in a given revision to the store'''
+
+ ctx = repo[node]
+ for filename in ctx.files():
+ if isstandin(filename) and filename in ctx.manifest():
+ realfile = splitstandin(filename)
+ copytostore(repo, ctx.node(), realfile)
+
+
def copytostoreabsolute(repo, file, hash):
util.makedirs(os.path.dirname(storepath(repo, hash)))
if inusercache(repo.ui, hash):
--- a/hgext/largefiles/overrides.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/largefiles/overrides.py Mon Jan 09 20:17:37 2012 -0600
@@ -20,6 +20,8 @@
import lfutil
import lfcommands
+# -- Utility functions: commonly/repeatedly needed functionality ---------------
+
def installnormalfilesmatchfn(manifest):
'''overrides scmutil.match so that the matcher it returns will ignore all
largefiles'''
@@ -51,13 +53,7 @@
restore matchfn to reverse'''
scmutil.match = getattr(scmutil.match, 'oldmatch', scmutil.match)
-# -- Wrappers: modify existing commands --------------------------------
-
-# Add works by going through the files that the user wanted to add and
-# checking if they should be added as largefiles. Then it makes a new
-# matcher which matches only the normal files and runs the original
-# version of add.
-def override_add(orig, ui, repo, *pats, **opts):
+def add_largefiles(ui, repo, *pats, **opts):
large = opts.pop('large', None)
lfsize = lfutil.getminsize(
ui, lfutil.islfilesrepo(repo), opts.pop('lfsize', None))
@@ -117,20 +113,10 @@
if f in m.files()]
finally:
wlock.release()
-
- installnormalfilesmatchfn(repo[None].manifest())
- result = orig(ui, repo, *pats, **opts)
- restorematchfn()
-
- return (result == 1 or bad) and 1 or 0
+ return bad
-def override_remove(orig, ui, repo, *pats, **opts):
- manifest = repo[None].manifest()
- installnormalfilesmatchfn(manifest)
- orig(ui, repo, *pats, **opts)
- restorematchfn()
-
- after, force = opts.get('after'), opts.get('force')
+def remove_largefiles(ui, repo, *pats, **opts):
+ after = opts.get('after')
if not pats and not after:
raise util.Abort(_('no files specified'))
m = scmutil.match(repo[None], pats, opts)
@@ -139,18 +125,17 @@
s = repo.status(match=m, clean=True)
finally:
repo.lfstatus = False
+ manifest = repo[None].manifest()
modified, added, deleted, clean = [[f for f in list
if lfutil.standin(f) in manifest]
for list in [s[0], s[1], s[3], s[6]]]
def warn(files, reason):
for f in files:
- ui.warn(_('not removing %s: %s (use -f to force removal)\n')
+ ui.warn(_('not removing %s: %s (use forget to undo)\n')
% (m.rel(f), reason))
- if force:
- remove, forget = modified + deleted + clean, added
- elif after:
+ if after:
remove, forget = deleted, []
warn(modified + added + clean, _('file still exists'))
else:
@@ -169,21 +154,48 @@
lfdirstate = lfutil.openlfdirstate(ui, repo)
for f in remove:
if not after:
- os.unlink(repo.wjoin(f))
+ # If this is being called by addremove, notify the user that we
+ # are removing the file.
+ if getattr(repo, "_isaddremove", False):
+ ui.status(_('removing %s\n' % f))
+ if os.path.exists(repo.wjoin(f)):
+ os.unlink(repo.wjoin(f))
currentdir = os.path.split(f)[0]
while currentdir and not os.listdir(repo.wjoin(currentdir)):
os.rmdir(repo.wjoin(currentdir))
currentdir = os.path.split(currentdir)[0]
lfdirstate.remove(f)
lfdirstate.write()
-
forget = [lfutil.standin(f) for f in forget]
remove = [lfutil.standin(f) for f in remove]
lfutil.repo_forget(repo, forget)
- lfutil.repo_remove(repo, remove, unlink=True)
+ # If this is being called by addremove, let the original addremove
+ # function handle this.
+ if not getattr(repo, "_isaddremove", False):
+ lfutil.repo_remove(repo, remove, unlink=True)
finally:
wlock.release()
+# -- Wrappers: modify existing commands --------------------------------
+
+# Add works by going through the files that the user wanted to add and
+# checking if they should be added as largefiles. Then it makes a new
+# matcher which matches only the normal files and runs the original
+# version of add.
+def override_add(orig, ui, repo, *pats, **opts):
+ bad = add_largefiles(ui, repo, *pats, **opts)
+ installnormalfilesmatchfn(repo[None].manifest())
+ result = orig(ui, repo, *pats, **opts)
+ restorematchfn()
+
+ return (result == 1 or bad) and 1 or 0
+
+def override_remove(orig, ui, repo, *pats, **opts):
+ installnormalfilesmatchfn(repo[None].manifest())
+ orig(ui, repo, *pats, **opts)
+ restorematchfn()
+ remove_largefiles(ui, repo, *pats, **opts)
+
def override_status(orig, ui, repo, *pats, **opts):
try:
repo.lfstatus = True
@@ -591,7 +603,6 @@
def hg_update(orig, repo, node):
result = orig(repo, node)
- # XXX check if it worked first
lfcommands.updatelfiles(repo.ui, repo)
return result
@@ -840,7 +851,11 @@
ui.status('\n')
def override_summary(orig, ui, repo, *pats, **opts):
- orig(ui, repo, *pats, **opts)
+ try:
+ repo.lfstatus = True
+ orig(ui, repo, *pats, **opts)
+ finally:
+ repo.lfstatus = False
if opts.pop('large', None):
toupload = getoutgoinglfiles(ui, repo, None, **opts)
@@ -850,26 +865,29 @@
ui.status(_('largefiles: %d to upload\n') % len(toupload))
def override_addremove(orig, ui, repo, *pats, **opts):
- # Check if the parent or child has largefiles; if so, disallow
- # addremove. If there is a symlink in the manifest then getting
- # the manifest throws an exception: catch it and let addremove
- # deal with it.
- try:
- manifesttip = set(repo['tip'].manifest())
- except util.Abort:
- manifesttip = set()
- try:
- manifestworking = set(repo[None].manifest())
- except util.Abort:
- manifestworking = set()
+ # Get the list of missing largefiles so we can remove them
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
+ False, False)
+ (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
- # Manifests are only iterable so turn them into sets then union
- for file in manifesttip.union(manifestworking):
- if file.startswith(lfutil.shortname):
- raise util.Abort(
- _('addremove cannot be run on a repo with largefiles'))
-
- return orig(ui, repo, *pats, **opts)
+ # Call into the normal remove code, but the removing of the standin, we want
+ # to have handled by original addremove. Monkey patching here makes sure
+ # we don't remove the standin in the largefiles code, preventing a very
+ # confused state later.
+ repo._isaddremove = True
+ remove_largefiles(ui, repo, *missing, **opts)
+ repo._isaddremove = False
+ # Call into the normal add code, and any files that *should* be added as
+ # largefiles will be
+ add_largefiles(ui, repo, *pats, **opts)
+ # Now that we've handled largefiles, hand off to the original addremove
+ # function to take care of the rest. Make sure it doesn't do anything with
+ # largefiles by installing a matcher that will ignore them.
+ installnormalfilesmatchfn(repo[None].manifest())
+ result = orig(ui, repo, *pats, **opts)
+ restorematchfn()
+ return result
# Calling purge with --all will cause the largefiles to be deleted.
# Override repo.status to prevent this from happening.
@@ -892,15 +910,19 @@
result = orig(ui, repo, **opts)
merge.update(repo, node=None, branchmerge=False, force=True,
partial=lfutil.isstandin)
- lfdirstate = lfutil.openlfdirstate(ui, repo)
- lfiles = lfutil.listlfiles(repo)
- oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev())
- for file in lfiles:
- if file in oldlfiles:
- lfdirstate.normallookup(file)
- else:
- lfdirstate.add(file)
- lfdirstate.write()
+ wlock = repo.wlock()
+ try:
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ lfiles = lfutil.listlfiles(repo)
+ oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev())
+ for file in lfiles:
+ if file in oldlfiles:
+ lfdirstate.normallookup(file)
+ else:
+ lfdirstate.add(file)
+ lfdirstate.write()
+ finally:
+ wlock.release()
return result
def override_transplant(orig, ui, repo, *revs, **opts):
--- a/hgext/largefiles/proto.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/largefiles/proto.py Mon Jan 09 20:17:37 2012 -0600
@@ -27,12 +27,12 @@
proto.getfile(tmpfp)
tmpfp.seek(0)
if sha != lfutil.hexsha1(tmpfp):
- return wireproto.pushres(1)
+ raise IOError(0, _('largefile contents do not match hash'))
tmpfp.close()
lfutil.copytostoreabsolute(repo, tmpname, sha)
except IOError, e:
- repo.ui.warn(_('largefiles: failed to put %s (%s) into store: %s') %
- (sha, tmpname, e.strerror))
+ repo.ui.warn(_('largefiles: failed to put %s into store: %s') %
+ (sha, e.strerror))
return wireproto.pushres(1)
finally:
tmpfp.close()
@@ -81,10 +81,16 @@
# input file-like into a bundle before sending it, so we can't use
# it ...
if issubclass(self.__class__, httprepo.httprepository):
+ res = None
try:
- return int(self._call('putlfile', data=fd, sha=sha,
- headers={'content-type':'application/mercurial-0.1'}))
+ res = self._call('putlfile', data=fd, sha=sha,
+ headers={'content-type':'application/mercurial-0.1'})
+ d, output = res.split('\n', 1)
+ for l in output.splitlines(True):
+ self.ui.warn(_('remote: '), l, '\n')
+ return int(d)
except (ValueError, urllib2.HTTPError):
+ self.ui.warn(_('unexpected putlfile response: %s') % res)
return 1
# ... but we can't use sshrepository._call because the data=
# argument won't get sent, and _callpush does exactly what we want
--- a/hgext/largefiles/reposetup.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/largefiles/reposetup.py Mon Jan 09 20:17:37 2012 -0600
@@ -11,7 +11,8 @@
import types
import os
-from mercurial import context, error, manifest, match as match_, node, util
+from mercurial import context, error, manifest, match as match_, util
+from mercurial import node as node_
from mercurial.i18n import _
import lfcommands
@@ -26,8 +27,6 @@
for name in ('status', 'commitctx', 'commit', 'push'):
method = getattr(repo, name)
- #if not (isinstance(method, types.MethodType) and
- # method.im_func is repo.__class__.commitctx.im_func):
if (isinstance(method, types.FunctionType) and
method.func_name == 'wrap'):
ui.warn(_('largefiles: repo method %r appears to have already been'
@@ -148,9 +147,6 @@
result = super(lfiles_repo, self).status(node1, node2, m,
True, clean, unknown, listsubrepos)
if working:
- # hold the wlock while we read largefiles and
- # update the lfdirstate
- wlock = repo.wlock()
try:
# Any non-largefiles that were explicitly listed must be
# taken out or lfdirstate.status will report an error.
@@ -187,7 +183,6 @@
else:
clean.append(lfile)
lfdirstate.normal(lfile)
- lfdirstate.write()
else:
tocheck = unsure + modified + added + clean
modified, added, clean = [], [], []
@@ -202,10 +197,9 @@
clean.append(lfile)
else:
added.append(lfile)
+ finally:
# Replace the original ignore function
lfdirstate._ignore = orig_ignore
- finally:
- wlock.release()
for standin in ctx1.manifest():
if not lfutil.isstandin(standin):
@@ -262,12 +256,7 @@
# cache.
def commitctx(self, *args, **kwargs):
node = super(lfiles_repo, self).commitctx(*args, **kwargs)
- ctx = self[node]
- for filename in ctx.files():
- if lfutil.isstandin(filename) and filename in ctx.manifest():
- realfile = lfutil.splitstandin(filename)
- lfutil.copytostore(self, ctx.node(), realfile)
-
+ lfutil.copyalltostore(self, node)
return node
# Before commit, largefile standins have not had their
@@ -279,14 +268,18 @@
wlock = repo.wlock()
try:
+ # Case 0: Rebase
+ # We have to take the time to pull down the new largefiles now.
+ # Otherwise if we are rebasing, any largefiles that were
+ # modified in the destination changesets get overwritten, either
+ # by the rebase or in the first commit after the rebase.
+ # updatelfiles will update the dirstate to mark any pulled
+ # largefiles as modified
if getattr(repo, "_isrebasing", False):
- # We have to take the time to pull down the new
- # largefiles now. Otherwise if we are rebasing,
- # any largefiles that were modified in the
- # destination changesets get overwritten, either
- # by the rebase or in the first commit after the
- # rebase.
lfcommands.updatelfiles(repo.ui, repo)
+ result = orig(text=text, user=user, date=date, match=match,
+ force=force, editor=editor, extra=extra)
+ return result
# Case 1: user calls commit with no specific files or
# include/exclude patterns: refresh and commit all files that
# are "dirty".
@@ -321,10 +314,13 @@
if not os.path.exists(
repo.wjoin(lfutil.standin(lfile))):
lfdirstate.drop(lfile)
+
+ result = orig(text=text, user=user, date=date, match=match,
+ force=force, editor=editor, extra=extra)
+ # This needs to be after commit; otherwise precommit hooks
+ # get the wrong status
lfdirstate.write()
-
- return orig(text=text, user=user, date=date, match=match,
- force=force, editor=editor, extra=extra)
+ return result
for f in match.files():
if lfutil.isstandin(f):
@@ -356,7 +352,6 @@
lfdirstate.normal(lfile)
else:
lfdirstate.drop(lfile)
- lfdirstate.write()
# Cook up a new matcher that only matches regular files or
# standins corresponding to the big files requested by the
@@ -397,8 +392,12 @@
return f in standins
match.matchfn = matchfn
- return orig(text=text, user=user, date=date, match=match,
+ result = orig(text=text, user=user, date=date, match=match,
force=force, editor=editor, extra=extra)
+ # This needs to be after commit; otherwise precommit hooks
+ # get the wrong status
+ lfdirstate.write()
+ return result
finally:
wlock.release()
@@ -409,7 +408,7 @@
o = repo.changelog.nodesbetween(o, revs)[0]
for n in o:
parents = [p for p in repo.changelog.parents(n)
- if p != node.nullid]
+ if p != node_.nullid]
ctx = repo[n]
files = set(ctx.files())
if len(parents) == 2:
--- a/hgext/mq.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/mq.py Mon Jan 09 20:17:37 2012 -0600
@@ -1854,8 +1854,9 @@
def delete(ui, repo, *patches, **opts):
"""remove patches from queue
- The patches must not be applied, and at least one patch is required. With
- -k/--keep, the patch files are preserved in the patch directory.
+ The patches must not be applied, and at least one patch is required. Exact
+ patch identifiers must be given. With -k/--keep, the patch files are
+ preserved in the patch directory.
To stop managing a patch and move it into permanent history,
use the :hg:`qfinish` command."""
--- a/hgext/progress.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/progress.py Mon Jan 09 20:17:37 2012 -0600
@@ -2,19 +2,8 @@
#
# Copyright (C) 2010 Augie Fackler <durin42@gmail.com>
#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
"""show progress bars for some actions
--- a/hgext/purge.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/purge.py Mon Jan 09 20:17:37 2012 -0600
@@ -20,8 +20,7 @@
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
'''command to delete untracked files from the working directory'''
--- a/hgext/rebase.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/rebase.py Mon Jan 09 20:17:37 2012 -0600
@@ -15,7 +15,7 @@
'''
from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
-from mercurial import extensions, patch
+from mercurial import extensions, patch, scmutil
from mercurial.commands import templateopts
from mercurial.node import nullrev
from mercurial.lock import release
@@ -187,10 +187,12 @@
if revf:
rebaseset = repo.revs('%lr', revf)
elif srcf:
- rebaseset = repo.revs('(%r)::', srcf)
+ src = scmutil.revrange(repo, [srcf])
+ rebaseset = repo.revs('(%ld)::', src)
else:
- base = basef or '.'
- rebaseset = repo.revs('(children(ancestor(%r, %d)) & ::%r)::',
+ base = scmutil.revrange(repo, [basef or '.'])
+ rebaseset = repo.revs(
+ '(children(ancestor(%ld, %d)) and ::(%ld))::',
base, dest, base)
if rebaseset:
@@ -269,7 +271,7 @@
'resolve, then hg rebase --continue)'))
finally:
ui.setconfig('ui', 'forcemerge', '')
- cmdutil.duplicatecopies(repo, rev, target, p2)
+ cmdutil.duplicatecopies(repo, rev, target)
if not collapsef:
newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn,
editor=editor)
--- a/hgext/zeroconf/Zeroconf.py Sun Jan 08 13:54:36 2012 +0400
+++ b/hgext/zeroconf/Zeroconf.py Mon Jan 09 20:17:37 2012 -0600
@@ -17,8 +17,8 @@
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ License along with this library; if not, see
+ <http://www.gnu.org/licenses/>.
"""
--- a/i18n/ja.po Sun Jan 08 13:54:36 2012 +0400
+++ b/i18n/ja.po Mon Jan 09 20:17:37 2012 -0600
@@ -108,7 +108,7 @@
msgstr ""
"Project-Id-Version: Mercurial\n"
"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
-"POT-Creation-Date: 2011-12-29 12:28+0900\n"
+"POT-Creation-Date: 2011-12-31 13:47+0900\n"
"PO-Revision-Date: 2009-11-16 21:24+0100\n"
"Last-Translator: Japanese translation team <mercurial-ja@googlegroups.com>\n"
"Language-Team: Japanese\n"
@@ -381,16 +381,17 @@
#, python-format
msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
msgstr ""
-
-#, fuzzy, python-format
+"acl: ユーザ \"%s\" はブランチ \"%s\" が許可されていません(リビジョン \"%s\")"
+
+#, python-format
msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
msgstr ""
-"acl: ユーザ \"%s\" はブランチ \"%s\" で拒否されました(リビジョン \"%s\")"
-
-#, fuzzy, python-format
+"acl: ユーザ \"%s\" はファイル \"%s\" で拒否されました(リビジョン \"%s\")"
+
+#, python-format
msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
msgstr ""
-"acl: ユーザ \"%s\" はブランチ \"%s\" で拒否されました(リビジョン \"%s\")"
+"acl: ユーザ \"%s\" はファイル \"%s\" が許可されていません(リビジョン \"%s\")"
msgid "hooks for integrating with the Bugzilla bug tracker"
msgstr ""
@@ -3345,9 +3346,8 @@
" 指定されたファイルに未コミット変更がある場合、 実行は中断されます。\n"
" "
-#, fuzzy
msgid "track large binary files"
-msgstr "これはバイナリファイルです\n"
+msgstr "大容量バイナリファイルの管理"
msgid ""
"Large binary files tend to be not very compressible, not very\n"
@@ -3443,12 +3443,19 @@
msgid ""
"Files that match one of these patterns will be added as largefiles\n"
-"regardless of their size.\n"
-msgstr ""
-
-#, fuzzy
+"regardless of their size."
+msgstr ""
+
+msgid ""
+"The ``largefiles.minsize`` and ``largefiles.patterns`` config options\n"
+"will be ignored for any repositories not already containing a\n"
+"largefile. To add the first largefile to a repository, you must\n"
+"explicitly do so with the --large flag passed to the :hg:`add`\n"
+"command.\n"
+msgstr ""
+
msgid "convert a normal repository to a largefiles repository"
-msgstr "別 SCM のリポジトリから Mercurial リポジトリへの変換"
+msgstr "既存リポジトリから largefiles を利用するリポジトリへの変換"
msgid ""
" Convert repository SOURCE to a new repository DEST, identical to\n"
@@ -3472,21 +3479,20 @@
" this, the DEST repository can be used without largefiles at all."
msgstr ""
-#, fuzzy
msgid "getting largefiles"
-msgstr "ファイルの取得中"
-
-#, fuzzy, python-format
+msgstr "大容量ファイルの取得中"
+
+#, python-format
msgid "getting %s:%s\n"
-msgstr "%s を取得しています\n"
+msgstr "ファイル %s の取得中:%s\n"
#, python-format
msgid "%s: data corruption (expected %s, got %s)\n"
msgstr ""
-#, fuzzy, python-format
+#, python-format
msgid "searching %d changesets for largefiles\n"
-msgstr "類似ファイルを探索中"
+msgstr "大容量ファイルのために %d 個のリビジョンを検索中\n"
#, python-format
msgid "verified contents of %d revisions of %d largefiles\n"
@@ -3496,25 +3502,24 @@
msgid "verified existence of %d revisions of %d largefiles\n"
msgstr ""
-#, fuzzy, python-format
+#, python-format
msgid "unsupported URL scheme %r"
-msgstr "URL 要素 \"%s\" は未サポートです"
-
-#, fuzzy, python-format
+msgstr "%r は未サポートな URL 形式です"
+
+#, python-format
msgid "%s does not appear to be a largefile store"
-msgstr "'%s' は Mercurial リポジトリ形式とは思われません"
-
-#, fuzzy, python-format
+msgstr "%s は largefiles 対応とは思われません"
+
+#, python-format
msgid "%s is not a local Mercurial repo"
msgstr "%s はローカルの Mercurial リポジトリではありません"
-#, fuzzy, python-format
+#, python-format
msgid "initializing destination %s\n"
msgstr "変換先リポジトリ %s の初期化中\n"
-#, fuzzy
msgid "converting revisions"
-msgstr "リビジョンの表示"
+msgstr "リビジョンの変換中"
#, python-format
msgid "renamed/copied largefile %s becomes symlink"
@@ -3531,9 +3536,8 @@
msgid "largefile %s missing from store (needs to be uploaded)"
msgstr ""
-#, fuzzy
msgid "getting changed largefiles\n"
-msgstr "ファイルの取得中"
+msgstr "更新された大容量ファイルの取得中\n"
#, python-format
msgid "%d largefiles updated, %d removed\n"
@@ -3545,9 +3549,8 @@
msgid "convert from a largefiles repo to a normal repo"
msgstr ""
-#, fuzzy
msgid "hg lfconvert SOURCE DEST [FILE ...]"
-msgstr "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr "hg lfconvert SOURCE DEST [FILE ...]"
#, python-format
msgid "largefiles: size must be number (not %s)\n"
@@ -3556,13 +3559,13 @@
msgid "minimum size for largefiles must be specified"
msgstr ""
-#, fuzzy, python-format
+#, python-format
msgid "unknown operating system: %s\n"
-msgstr "未知のパッチです: %s\n"
-
-#, fuzzy, python-format
+msgstr "未知の OS です: %s\n"
+
+#, python-format
msgid "Found %s in store\n"
-msgstr "%s が %r にありました\n"
+msgstr "%s が見つかりました\n"
#, python-format
msgid "Found %s in system cache\n"
@@ -3589,33 +3592,29 @@
" but got %s)\n"
msgstr ""
-#, fuzzy, python-format
+#, python-format
msgid "%s already a largefile\n"
-msgstr "%s は登録済です!\n"
-
-#, fuzzy, python-format
+msgstr "%s は大容量ファイルとして登録済です\n"
+
+#, python-format
msgid "adding %s as a largefile\n"
-msgstr "パッチ %s を追加中\n"
+msgstr "%s を大容量ファイルとして追加登録中\n"
msgid "no files specified"
msgstr "ファイル名指定がありません"
-#, fuzzy, python-format
+#, python-format
msgid "not removing %s: %s (use -f to force removal)\n"
-msgstr ""
-"%s は削除されません: ファイルは改変されています(削除の強行は -f を指定)\n"
-
-#, fuzzy
+msgstr "%s は削除されません: %s (削除の強行は -f を指定)\n"
+
msgid "file still exists"
-msgstr "ファイル %s は既に存在します\n"
-
-#, fuzzy
+msgstr "ファイルは維持されます"
+
msgid "file is modified"
-msgstr "変更ファイル数 %d"
-
-#, fuzzy
+msgstr "ファイルは改変されています"
+
msgid "file has been marked for add"
-msgstr "%s: コピー失敗 - 削除予定のファイルです\n"
+msgstr "追加登録予定のファイルです"
#, python-format
msgid "removing %s\n"
@@ -3650,12 +3649,12 @@
msgid "merging %s\n"
msgstr "%s をマージ中\n"
-#, fuzzy, python-format
+#, python-format
msgid ""
"largefile %s has a merge conflict\n"
"keep (l)ocal or take (o)ther?"
msgstr ""
-" %s のマージに適切なツールが見つかりません\n"
+"大容量ファイル %s のマージで衝突が検出されました。\n"
"どちらの内容を採用しますか? 作業領域:(l)ocal マージ対象:(o)ther"
msgid "&Local"
@@ -3664,9 +3663,8 @@
msgid "&Other"
msgstr "&Other"
-#, fuzzy
msgid "destination largefile already exists"
-msgstr "複製先 '%s' は既に存在します"
+msgstr "大容量ファイルの複製先は既に存在します"
msgid "no files to copy"
msgstr "コピーするファイルがありません"
@@ -3682,16 +3680,15 @@
msgid "not removing %s: file is already untracked\n"
msgstr "%s は削除されません: 既に構成管理対象ではありません\n"
-#, fuzzy
msgid "largefiles: No remote repo\n"
-msgstr "ローカルリポジトリ以外は検証できません"
+msgstr ""
msgid "largefiles to upload:\n"
-msgstr ""
+msgstr "転送予定大容量ファイル:\n"
#, python-format
msgid "largefiles: %d to upload\n"
-msgstr ""
+msgstr "largefiles: 転送予定ファイル数 %d\n"
msgid "addremove cannot be run on a repo with largefiles"
msgstr ""
@@ -3704,13 +3701,11 @@
msgid "requested largefile %s not present in cache"
msgstr ""
-#, fuzzy
msgid "putlfile failed:"
-msgstr "フィルターに失敗"
-
-#, fuzzy
+msgstr "大容量ファイルの転送に失敗:"
+
msgid "putlfile failed (unexpected response):"
-msgstr "履歴反映に失敗(未知のレスポンス):"
+msgstr "大容量ファイルの転送に失敗 (未知の応答):"
msgid "unexpected response:"
msgstr "未知の応答:"
@@ -3723,9 +3718,9 @@
msgid "remotestore: put %s to remote store %s"
msgstr ""
-#, fuzzy, python-format
+#, python-format
msgid "remotestore: could not open file %s: %s"
-msgstr "変換ファイル %r を開くことができません: %s"
+msgstr "remotestore: ファイル %s を開くことができません: %s"
#, python-format
msgid "remotestore: largefile %s is invalid"
@@ -3735,13 +3730,13 @@
msgid "remotestore: largefile %s is missing"
msgstr ""
-#, fuzzy, python-format
+#, python-format
msgid "changeset %s: %s: contents differ\n"
-msgstr "リビジョン %d:%s: %s\n"
-
-#, fuzzy, python-format
+msgstr "リビジョン %s: %s: 内容が異なります\n"
+
+#, python-format
msgid "changeset %s: %s missing\n"
-msgstr "リビジョン %d:%s: %s\n"
+msgstr "リビジョン %s: ファイル %s が不在です\n"
#, python-format
msgid ""
@@ -3769,9 +3764,8 @@
msgid "verify largefile contents not just existence"
msgstr ""
-#, fuzzy
msgid "display outgoing largefiles"
-msgstr "当該スタイルで表示をカスタマイズ"
+msgstr "転送対象大容量ファイルを表示"
msgid "manage a stack of patches"
msgstr "パッチ併用の管理"
@@ -5315,9 +5309,8 @@
msgid "operate on patch repository"
msgstr "パッチ管理リポジトリへの操作"
-#, fuzzy
msgid "hooks for sending email push notifications"
-msgstr "commit/push 契機でのメール通知用フック集"
+msgstr "push 通知電子メール送信用のフック集"
msgid ""
"This extension let you run hooks sending email notifications when\n"
@@ -6147,9 +6140,8 @@
"ancestor of base and dest)"
msgstr "指定リビジョンの先祖から移動 (移動先との共通祖先まで遡ります)"
-#, fuzzy
msgid "rebase these revisions"
-msgstr "指定リビジョンの解析"
+msgstr "指定リビジョンの移動"
msgid "rebase onto the specified changeset"
msgstr "複製先リビジョン"
@@ -6305,16 +6297,14 @@
msgid "tool option will be ignored\n"
msgstr ""
-#, fuzzy
msgid "cannot specify both a source and a base"
msgstr "--soruce と --base は併用できません"
msgid "cannot specify both a revision and a base"
-msgstr "--soruce と --base は併用できません"
-
-#, fuzzy
+msgstr "--rev と --base は併用できません"
+
msgid "cannot specify both a revision and a source"
-msgstr "--soruce と --base は併用できません"
+msgstr "--rev と --soruce は併用できません"
msgid "detach requires a revision to be specified"
msgstr "--detach にはリビジョン指定が必要です"
@@ -6325,9 +6315,8 @@
msgid "can't remove original changesets with unrebased descendants"
msgstr ""
-#, fuzzy
msgid "use --keep to keep original changesets"
-msgstr "元リビジョンを維持"
+msgstr "元リビジョンを維持する場合は --keep を使用してください"
msgid "nothing to rebase\n"
msgstr "リベースの必要はありません\n"
@@ -6380,9 +6369,8 @@
msgid "cannot rebase onto an applied mq patch"
msgstr "MQ パッチ上へのリベースはできません"
-#, fuzzy
msgid "no matching revisions"
-msgstr "合致するガードはありません"
+msgstr "合致するリビジョンはありません"
msgid "can't rebase multiple roots"
msgstr ""
@@ -6718,18 +6706,16 @@
" "
msgstr ""
-#, fuzzy
msgid "convert a shared repository to a normal one"
-msgstr "別 SCM のリポジトリから Mercurial リポジトリへの変換"
+msgstr "共有状態のリポジトリから通常リポジトリへの変換"
msgid ""
" Copy the store data to the repo and remove the sharedpath data.\n"
" "
msgstr ""
-#, fuzzy
msgid "this is not a shared repo"
-msgstr "%s は %s の親リビジョンではありません"
+msgstr "共有状態のリポジトリではありません"
msgid "do not create a working copy"
msgstr "作業領域の更新を抑止します"
@@ -11275,21 +11261,13 @@
" - unbundle"
msgid ""
-" It's possible to lose data with rollback: commit, update back to\n"
-" an older changeset, and then rollback. The update removes the\n"
-" changes you committed from the working directory, and rollback\n"
-" removes them from history. To avoid data loss, you must pass\n"
-" --force in this case."
-msgstr ""
-" 例えば commit、旧リビジョンへの update、 rollback の順で実行すると、\n"
-" データが喪失します。 commit 内容が、 update により作業領域から、\n"
-" rollback により履歴から破棄されるためです。\n"
-" このケースにおけるデータ喪失を避けるには --force を指定してください。\n"
-" (訳注: --force 指定が『無い』場合、 このケースのようなデータ喪失は、\n"
-" 実行中断により防止されます。 原文では、 --force 指定は\n"
-" \"avoid data loss\" (データ喪失の回避) のためと記載されていますが、\n"
-" 実際には『データ喪失に構わず rollback を強行する』場合にのみ\n"
-" --force を指定してください)"
+" To avoid permanent data loss, rollback will refuse to rollback a\n"
+" commit transaction if it isn't checked out. Use --force to\n"
+" override this protection."
+msgstr ""
+" データが永遠に失われるのを回避するため、 コミットの巻き戻し操作は、\n"
+" 作業領域の親リビジョン以外に対しては、 失敗するようになっています。\n"
+" この回避挙動は --force 指定により抑止されます。"
msgid ""
" This command is not intended for use on public repositories. Once\n"
@@ -20286,85 +20264,10 @@
msgstr "連携先でのリビジョンの検索"
msgid "push failed (unexpected response):"
-msgstr "履歴反映に失敗(未知のレスポンス):"
+msgstr "履歴反映に失敗 (未知の応答):"
msgid "look up remote changes"
msgstr "連携先での変更の検索"
msgid "push failed:"
msgstr "履歴反映に失敗:"
-
-#~ msgid "acl: access denied for changeset %s"
-#~ msgstr "acl: チェンジセット %s のアクセスは拒否されました"
-
-#~ msgid "%s Please enter a valid value"
-#~ msgstr "%s 適切な値を入力してください"
-
-#~ msgid "Please enter a valid value.\n"
-#~ msgstr "適切な値を入力してください。\n"
-
-#~ msgid "source is descendant of destination"
-#~ msgstr "移動元は移動先の子孫です"
-
-#~ msgid "cannot backout a merge changeset without --parent"
-#~ msgstr "マージリビジョンの打消しには --parent 指定が必要です"
-
-#~ msgid " .. note::"
-#~ msgstr " .. note::"
-
-#~ msgid " See :hg:`help urls` for valid source format details."
-#~ msgstr ""
-#~ " リポジトリ位置指定の詳細は、 :hg:`help urls` を参照してください。"
-
-#~ msgid ""
-#~ " It is possible to specify an ``ssh://`` URL as the destination, but "
-#~ "no\n"
-#~ " ``.hg/hgrc`` and working directory will be created on the remote "
-#~ "side.\n"
-#~ " Please see :hg:`help urls` for important details about ``ssh://`` "
-#~ "URLs."
-#~ msgstr ""
-#~ " 複製先として ``ssh://`` URL 形式を指定することも可能ですが、\n"
-#~ " 遠隔ホスト上では、 ``.hg/hgrc`` の作成も、\n"
-#~ " 作業領域の更新も行われません。\n"
-#~ " ``ssh://`` URL 形式の詳細は、 :hg:`help urls` を参照してください。"
-
-#~ msgid ""
-#~ " A set of changesets (tags, or branch names) to pull may be specified\n"
-#~ " by listing each changeset (tag, or branch name) with -r/--rev.\n"
-#~ " If -r/--rev is used, the cloned repository will contain only a "
-#~ "subset\n"
-#~ " of the changesets of the source repository. Only the set of "
-#~ "changesets\n"
-#~ " defined by all -r/--rev options (including all their ancestors)\n"
-#~ " will be pulled into the destination repository.\n"
-#~ " No subsequent changesets (including subsequent tags) will be present\n"
-#~ " in the destination."
-#~ msgstr ""
-#~ " 複製先に取り込む一連のリビジョンは、 -r/--rev によりリビジョン\n"
-#~ " (タグ名やブランチ名も可) を列挙することで指定します。\n"
-#~ " -r/--rev でのリビジョン指定複製を行なう場合、 複製先リポジトリには、\n"
-#~ " 複製元リポジトリの持つリビジョンの、 一部のみが取り込まれます。\n"
-#~ " 取り込み対象は、 -r/--rev での指定リビジョン (およびその祖先) です。\n"
-#~ " 指定リビジョン以後のリビジョンは、 複製先に取り込まれません\n"
-#~ " (後続のタグ付けリビジョンも除外されます)。"
-
-#~ msgid ""
-#~ " Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
-#~ " local source repositories."
-#~ msgstr ""
-#~ " -r/--rev 指定付き (ないしは :hg:`clone 複製元#リビジョン` 形式)\n"
-#~ " 複製の場合、 同一ファイルシステム上での複製であっても、\n"
-#~ " 暗黙的に --pull 指定を伴います。"
-
-#~ msgid "options:\n"
-#~ msgstr "オプション:\n"
-
-#~ msgid "applied %s\n"
-#~ msgstr "%s に対して適用\n"
-
-#~ msgid "limit requires two arguments"
-#~ msgstr "limit 指定には2つの引数が必要です"
-
-#~ msgid "last requires two arguments"
-#~ msgstr "last 指定には2つの引数が必要です"
--- a/i18n/pt_BR.po Sun Jan 08 13:54:36 2012 +0400
+++ b/i18n/pt_BR.po Mon Jan 09 20:17:37 2012 -0600
@@ -4206,10 +4206,23 @@
msgid ""
"Files that match one of these patterns will be added as largefiles\n"
-"regardless of their size.\n"
+"regardless of their size."
msgstr ""
"Arquivos que corresponderem a um desses padrões serão adicionados\n"
-"como largefiles sem que seus tamanhos sejam considerados.\n"
+"como largefiles sem que seus tamanhos sejam considerados."
+
+msgid ""
+"The ``largefiles.minsize`` and ``largefiles.patterns`` config options\n"
+"will be ignored for any repositories not already containing a\n"
+"largefile. To add the first largefile to a repository, you must\n"
+"explicitly do so with the --large flag passed to the :hg:`add`\n"
+"command.\n"
+msgstr ""
+"As opções de configuração ``largefiles.minsize`` e ``largefiles.patterns``\n"
+"serão ignoradas em qualquer repositório que ainda não contenha um\n"
+"largefile. Para adicionar o primeiro largefile de um repositório,\n"
+"você deve fazê-lo explicitamente passando a opção --large para o\n"
+"comando :hg:`add`.\n"
msgid "convert a normal repository to a largefiles repository"
msgstr "converte um repositório normal em um repositório largefiles"
@@ -4402,6 +4415,28 @@
msgid "uncommitted local changes"
msgstr "alterações locais pendentes"
+msgid "&Largefile"
+msgstr "&Largefile"
+
+msgid "&Normal file"
+msgstr "Arquivo &Normal"
+
+#, python-format
+msgid ""
+"%s has been turned into a largefile\n"
+"use (l)argefile or keep as (n)ormal file?"
+msgstr ""
+"%s foi transformado em um largefile\n"
+"usar (l)argefile ou manter como arquivo (n)ormal?"
+
+#, python-format
+msgid ""
+"%s has been turned into a normal file\n"
+"keep as (l)argefile or use (n)ormal file?"
+msgstr ""
+"%s foi transformado em um arquivo normal\n"
+"manter como (l)argefile ou usar um arquivo (n)ormal?"
+
#, python-format
msgid "merging %s and %s to %s\n"
msgstr "mesclando %s e %s para %s\n"
@@ -10651,12 +10686,12 @@
msgid ""
" If a graft merge results in conflicts, the graft process is\n"
-" aborted so that the current merge can be manually resolved. Once\n"
-" all conflicts are addressed, the graft process can be continued\n"
-" with the -c/--continue option."
+" interrupted so that the current merge can be manually resolved.\n"
+" Once all conflicts are addressed, the graft process can be\n"
+" continued with the -c/--continue option."
msgstr ""
" Se a mesclagem de enxerto resultar em conflitos, o processo de\n"
-" enxerto será abortado para que a mesclagem atual possa ser\n"
+" enxerto será interrompido para que a mesclagem atual possa ser\n"
" resolvida manualmente. Uma vez que todos os conflitos estejam\n"
" resolvidos, o processo de enxerto pode ser retomado usando a\n"
" opção -c/--continue."
@@ -12502,17 +12537,14 @@
" - unbundle"
msgid ""
-" It's possible to lose data with rollback: commit, update back to\n"
-" an older changeset, and then rollback. The update removes the\n"
-" changes you committed from the working directory, and rollback\n"
-" removes them from history. To avoid data loss, you must pass\n"
-" --force in this case."
-msgstr ""
-" É possível perder dados com o comando rollback: se for feito um\n"
-" commit, update para uma revisão antiga, e em seguida rollback.\n"
-" O update remove as mudanças recém gravadas na última consolidação,\n"
-" e o rollback as remove do histórico. Para evitar perda de dados,\n"
-" você deve passar --force neste caso."
+" To avoid permanent data loss, rollback will refuse to rollback a\n"
+" commit transaction if it isn't checked out. Use --force to\n"
+" override this protection."
+msgstr ""
+" Para evitar perda permanente de dados, o comando rollback se recusará\n"
+" a desfazer a transação de um commit se a revisão correspondente não\n"
+" for a revisão atual do diretório de trabalho. Para desabilitar essa\n"
+" proteção e remover a revisão de qualquer maneira, use a opção --force."
msgid ""
" This command is not intended for use on public repositories. Once\n"
--- a/mercurial/byterange.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/byterange.py Mon Jan 09 20:17:37 2012 -0600
@@ -9,10 +9,8 @@
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc.,
-# 59 Temple Place, Suite 330,
-# Boston, MA 02111-1307 USA
+# License along with this library; if not, see
+# <http://www.gnu.org/licenses/>.
# This file is part of urlgrabber, a high-level cross-protocol url-grabber
# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
--- a/mercurial/cmdutil.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/cmdutil.py Mon Jan 09 20:17:37 2012 -0600
@@ -1198,18 +1198,10 @@
bad.extend(f for f in rejected if f in match.files())
return bad
-def duplicatecopies(repo, rev, p1, p2):
+def duplicatecopies(repo, rev, p1):
"Reproduce copies found in the source revision in the dirstate for grafts"
- # Here we simulate the copies and renames in the source changeset
- cop, diver = copies.copies(repo, repo[rev], repo[p1], repo[p2], True)
- m1 = repo[rev].manifest()
- m2 = repo[p1].manifest()
- for k, v in cop.iteritems():
- if k in m1:
- if v in m1 or v in m2:
- repo.dirstate.copy(v, k)
- if v in m2 and v not in m1 and k in m2:
- repo.dirstate.remove(v)
+ for dst, src in copies.pathcopies(repo[p1], repo[rev]).iteritems():
+ repo.dirstate.copy(src, dst)
def commit(ui, repo, commitfunc, pats, opts):
'''commit the specified files or all outstanding changes'''
--- a/mercurial/commands.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/commands.py Mon Jan 09 20:17:37 2012 -0600
@@ -2627,7 +2627,7 @@
repo.dirstate.setparents(current.node(), nullid)
repo.dirstate.write()
# fix up dirstate for copies and renames
- cmdutil.duplicatecopies(repo, ctx.rev(), current.node(), nullid)
+ cmdutil.duplicatecopies(repo, ctx.rev(), current.node())
# report any conflicts
if stats and stats[3] > 0:
# write out state for --continue
@@ -2694,7 +2694,7 @@
Returns 0 if a match is found, 1 otherwise.
"""
- reflags = 0
+ reflags = re.M
if opts.get('ignore_case'):
reflags |= re.I
try:
@@ -3444,7 +3444,7 @@
revision.
With -s/--similarity, hg will attempt to discover renames and
- copies in the patch in the same way as 'addremove'.
+ copies in the patch in the same way as :hg:`addremove`.
To read a patch from standard input, use "-" as the patch name. If
a URL is specified, the patch will be downloaded from it.
@@ -5206,18 +5206,7 @@
changestates = zip(states, 'MAR!?IC', stat)
if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
- ctxn = repo[nullid]
- ctx1 = repo[node1]
- ctx2 = repo[node2]
- added = stat[1]
- if node2 is None:
- added = stat[0] + stat[1] # merged?
-
- for k, v in copies.copies(repo, ctx1, ctx2, ctxn)[0].iteritems():
- if k in added:
- copy[k] = v
- elif v in added:
- copy[v] = k
+ copy = copies.pathcopies(repo[node1], repo[node2])
for state, char, files in changestates:
if state in show:
--- a/mercurial/copies.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/copies.py Mon Jan 09 20:17:37 2012 -0600
@@ -84,7 +84,91 @@
return None
return limit
-def copies(repo, c1, c2, ca, checkdirs=False):
+def _chain(src, dst, a, b):
+ '''chain two sets of copies a->b'''
+ t = a.copy()
+ for k, v in b.iteritems():
+ if v in t:
+ # found a chain
+ if t[v] != k:
+ # file wasn't renamed back to itself
+ t[k] = t[v]
+ if v not in dst:
+ # chain was a rename, not a copy
+ del t[v]
+ if v in src:
+ # file is a copy of an existing file
+ t[k] = v
+ return t
+
+def _tracefile(fctx, actx):
+ '''return file context that is the ancestor of fctx present in actx'''
+ stop = actx.rev()
+ am = actx.manifest()
+
+ for f in fctx.ancestors():
+ if am.get(f.path(), None) == f.filenode():
+ return f
+ if f.rev() < stop:
+ return None
+
+def _dirstatecopies(d):
+ ds = d._repo.dirstate
+ c = ds.copies().copy()
+ for k in c.keys():
+ if ds[k] not in 'anm':
+ del c[k]
+ return c
+
+def _forwardcopies(a, b):
+ '''find {dst@b: src@a} copy mapping where a is an ancestor of b'''
+
+ # check for working copy
+ w = None
+ if b.rev() is None:
+ w = b
+ b = w.p1()
+ if a == b:
+ # short-circuit to avoid issues with merge states
+ return _dirstatecopies(w)
+
+ # find where new files came from
+ # we currently don't try to find where old files went, too expensive
+ # this means we can miss a case like 'hg rm b; hg cp a b'
+ cm = {}
+ for f in b:
+ if f not in a:
+ ofctx = _tracefile(b[f], a)
+ if ofctx:
+ cm[f] = ofctx.path()
+
+ # combine copies from dirstate if necessary
+ if w is not None:
+ cm = _chain(a, w, cm, _dirstatecopies(w))
+
+ return cm
+
+def _backwardcopies(a, b):
+ # because the forward mapping is 1:n, we can lose renames here
+ # in particular, we find renames better than copies
+ f = _forwardcopies(b, a)
+ r = {}
+ for k, v in f.iteritems():
+ r[v] = k
+ return r
+
+def pathcopies(x, y):
+ '''find {dst@y: src@x} copy mapping for directed compare'''
+ if x == y or not x or not y:
+ return {}
+ a = y.ancestor(x)
+ if a == x:
+ return _forwardcopies(x, y)
+ if a == y:
+ return _backwardcopies(x, y)
+ return _chain(x, y, _backwardcopies(x, a), _forwardcopies(a, y))
+
+def mergecopies(repo, c1, c2, ca, checkdirs=True):
"""
Find moves and copies between context c1 and c2
"""
--- a/mercurial/dirstate.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/dirstate.py Mon Jan 09 20:17:37 2012 -0600
@@ -4,6 +4,7 @@
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
+import errno
from node import nullid
from i18n import _
@@ -49,7 +50,7 @@
self._rootdir = os.path.join(root, '')
self._dirty = False
self._dirtypl = False
- self._lastnormaltime = None
+ self._lastnormaltime = 0
self._ui = ui
@propertycache
@@ -80,7 +81,9 @@
def _branch(self):
try:
return self._opener.read("branch").strip() or "default"
- except IOError:
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
return "default"
@propertycache
@@ -251,7 +254,7 @@
"_ignore"):
if a in self.__dict__:
delattr(self, a)
- self._lastnormaltime = None
+ self._lastnormaltime = 0
self._dirty = False
def copy(self, source, dest):
@@ -415,7 +418,7 @@
delattr(self, "_dirs")
self._copymap = {}
self._pl = [nullid, nullid]
- self._lastnormaltime = None
+ self._lastnormaltime = 0
self._dirty = True
def rebuild(self, parent, files):
@@ -463,7 +466,7 @@
write(f)
st.write(cs.getvalue())
st.close()
- self._lastnormaltime = None
+ self._lastnormaltime = 0
self._dirty = self._dirtypl = False
def _dirignore(self, f):
--- a/mercurial/dispatch.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/dispatch.py Mon Jan 09 20:17:37 2012 -0600
@@ -583,7 +583,7 @@
raise util.Abort(_("option --cwd may not be abbreviated!"))
if options["repository"]:
raise util.Abort(_(
- "Option -R has to be separated from other options (e.g. not -qR) "
+ "option -R has to be separated from other options (e.g. not -qR) "
"and --repository may only be abbreviated as --repo!"))
if options["encoding"]:
--- a/mercurial/encoding.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/encoding.py Mon Jan 09 20:17:37 2012 -0600
@@ -105,7 +105,7 @@
return localstr(u.encode('UTF-8'), r)
except LookupError, k:
- raise error.Abort("%s, please check your locale settings" % k)
+ raise error.Abort(k, hint="please check your locale settings")
except UnicodeDecodeError:
pass
u = s.decode("utf-8", "replace") # last ditch
@@ -132,7 +132,7 @@
sub = s[max(0, inst.start - 10):inst.start + 10]
raise error.Abort("decoding near '%s': %s!" % (sub, inst))
except LookupError, k:
- raise error.Abort("%s, please check your locale settings" % k)
+ raise error.Abort(k, hint="please check your locale settings")
# How to treat ambiguous-width characters. Set to 'wide' to treat as wide.
wide = (os.environ.get("HGENCODINGAMBIGUOUS", "narrow") == "wide"
--- a/mercurial/httpconnection.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/httpconnection.py Mon Jan 09 20:17:37 2012 -0600
@@ -38,7 +38,7 @@
self.write = self._data.write
self.length = os.fstat(self._data.fileno()).st_size
self._pos = 0
- self._total = self.length / 1024 * 2
+ self._total = self.length // 1024 * 2
def read(self, *args, **kwargs):
try:
@@ -51,7 +51,7 @@
# requires authentication. Since we can't know until we try
# once whether authentication will be required, just lie to
# the user and maybe the push succeeds suddenly at 50%.
- self.ui.progress(_('sending'), self._pos / 1024,
+ self.ui.progress(_('sending'), self._pos // 1024,
unit=_('kb'), total=self._total)
return ret
--- a/mercurial/keepalive.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/keepalive.py Mon Jan 09 20:17:37 2012 -0600
@@ -9,10 +9,8 @@
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc.,
-# 59 Temple Place, Suite 330,
-# Boston, MA 02111-1307 USA
+# License along with this library; if not, see
+# <http://www.gnu.org/licenses/>.
# This file is part of urlgrabber, a high-level cross-protocol url-grabber
# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
--- a/mercurial/merge.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/merge.py Mon Jan 09 20:17:37 2012 -0600
@@ -183,7 +183,7 @@
pa = p1.p1()
elif pa and repo.ui.configbool("merge", "followcopies", True):
dirs = repo.ui.configbool("merge", "followdirs", True)
- copy, diverge = copies.copies(repo, p1, p2, pa, dirs)
+ copy, diverge = copies.mergecopies(repo, p1, p2, pa, dirs)
for of, fl in diverge.iteritems():
act("divergent renames", "dr", of, fl)
--- a/mercurial/patch.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/patch.py Mon Jan 09 20:17:37 2012 -0600
@@ -1600,7 +1600,7 @@
copy = {}
if opts.git or opts.upgrade:
- copy = copies.copies(repo, ctx1, ctx2, repo[nullid])[0]
+ copy = copies.pathcopies(ctx1, ctx2)
difffn = lambda opts, losedata: trydiff(repo, revs, ctx1, ctx2,
modified, added, removed, copy, getfilectx, opts, losedata, prefix)
--- a/mercurial/posix.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/posix.py Mon Jan 09 20:17:37 2012 -0600
@@ -438,6 +438,8 @@
def cacheable(self):
return bool(self.stat.st_ino)
+ __hash__ = object.__hash__
+
def __eq__(self, other):
try:
return self.stat == other.stat
--- a/mercurial/revset.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/revset.py Mon Jan 09 20:17:37 2012 -0600
@@ -1108,7 +1108,7 @@
return '(0-0)' # a minimal way to represent an empty set
if l == 1:
return argtype(t, s[0])
- m = l / 2
+ m = l // 2
return '(%s or %s)' % (listexp(s[:m], t), listexp(s[m:], t))
ret = ''
--- a/mercurial/scmutil.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/scmutil.py Mon Jan 09 20:17:37 2012 -0600
@@ -313,8 +313,8 @@
try:
name_st = os.stat(name)
except OSError:
- break
- if util.samestat(name_st, root_st):
+ name_st = None
+ if name_st and util.samestat(name_st, root_st):
if not rel:
# name was actually the same as root (maybe a symlink)
return ''
--- a/mercurial/simplemerge.py Sun Jan 08 13:54:36 2012 +0400
+++ b/mercurial/simplemerge.py Mon Jan 09 20:17:37 2012 -0600
@@ -11,8 +11,7 @@
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
# mbp: "you know that thing where cvs gives you conflict markers?"
# s: "i hate that."
--- a/tests/dummyssh Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/dummyssh Mon Jan 09 20:17:37 2012 -0600
@@ -16,5 +16,9 @@
log.write(" %d:%s" % (i+1, arg))
log.write("\n")
log.close()
-r = os.system(sys.argv[2])
+hgcmd = sys.argv[2]
+if os.name == 'nt':
+ # hack to make simple unix single quote quoting work on windows
+ hgcmd = hgcmd.replace("'", '"')
+r = os.system(hgcmd)
sys.exit(bool(r))
--- a/tests/test-command-template.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-command-template.t Mon Jan 09 20:17:37 2012 -0600
@@ -1117,7 +1117,7 @@
$ hg log --template '{date|age}\n' > /dev/null || exit 1
$ hg log -l1 --template '{date|age}\n'
- 8 years from now
+ 7 years from now
$ hg log --template '{date|date}\n'
Wed Jan 01 10:01:00 2020 +0000
Mon Jan 12 13:46:40 1970 +0000
--- a/tests/test-encoding.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-encoding.t Mon Jan 09 20:17:37 2012 -0600
@@ -235,7 +235,8 @@
hg log (dolphin)
$ HGENCODING=dolphin hg log
- abort: unknown encoding: dolphin, please check your locale settings
+ abort: unknown encoding: dolphin
+ (please check your locale settings)
[255]
$ HGENCODING=ascii hg branch `cat latin-1-tag`
abort: decoding near '\xe9': 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)! (esc)
--- a/tests/test-globalopts.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-globalopts.t Mon Jan 09 20:17:37 2012 -0600
@@ -136,16 +136,16 @@
abort: option --cwd may not be abbreviated!
[255]
$ hg --rep a tip
- abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
+ abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
[255]
$ hg --repositor a tip
- abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
+ abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
[255]
$ hg -qR a tip
- abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
+ abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
[255]
$ hg -qRa tip
- abort: Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
+ abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
[255]
Testing --cwd:
--- a/tests/test-graft.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-graft.t Mon Jan 09 20:17:37 2012 -0600
@@ -106,14 +106,6 @@
b: local copied/moved to a -> m
preserving b for resolve of b
updating: b 1/1 files (100.00%)
- searching for copies back to rev 1
- unmatched files in local:
- a
- unmatched files in other:
- b
- all copies found (* = to merge, ! = divergent):
- b -> a *
- checking for directory renames
b
b: searching for copy revision for a
b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
@@ -127,12 +119,6 @@
e: remote is newer -> g
updating: e 1/1 files (100.00%)
getting e
- searching for copies back to rev 1
- unmatched files in local:
- c
- all copies found (* = to merge, ! = divergent):
- c -> b *
- checking for directory renames
e
grafting revision 4
searching for copies back to rev 1
@@ -152,12 +138,6 @@
my e@77eb504366ab+ other e@9c233e8e184d ancestor e@68795b066622
warning: conflicts during merge.
merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
- searching for copies back to rev 1
- unmatched files in local:
- c
- all copies found (* = to merge, ! = divergent):
- c -> b *
- checking for directory renames
abort: unresolved conflicts, can't continue
(use hg resolve and hg graft --continue)
[255]
--- a/tests/test-grep.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-grep.t Mon Jan 09 20:17:37 2012 -0600
@@ -59,8 +59,9 @@
follow
- $ hg grep --traceback -f 'import$' port2
+ $ hg grep --traceback -f 'import\n\Z' port2
port:0:import
+
$ echo deport >> port2
$ hg commit -m 5 -u eggs -d '6 0'
$ hg grep -f --all -nu port port2
--- a/tests/test-largefiles-small-disk.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-largefiles-small-disk.t Mon Jan 09 20:17:37 2012 -0600
@@ -65,4 +65,3 @@
The largefile is not created in .hg/largefiles:
$ ls bob/.hg/largefiles
- dirstate
--- a/tests/test-largefiles.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-largefiles.t Mon Jan 09 20:17:37 2012 -0600
@@ -1,5 +1,6 @@
$ "$TESTDIR/hghave" symlink unix-permissions serve || exit 80
-
+ $ USERCACHE=`pwd`/cache; export USERCACHE
+ $ mkdir -p ${USERCACHE}
$ cat >> $HGRCPATH <<EOF
> [extensions]
> largefiles=
@@ -11,10 +12,14 @@
> [largefiles]
> minsize=2
> patterns=glob:**.dat
+ > usercache=${USERCACHE}
+ > [hooks]
+ > precommit=echo "Invoking status precommit hook"; hg status
> EOF
Create the repo with a couple of revisions of both large and normal
-files, testing that status correctly shows largefiles.
+files, testing that status correctly shows largefiles and that summary output
+is correct.
$ hg init a
$ cd a
@@ -26,16 +31,28 @@
$ hg add normal1 sub/normal2
$ hg add --large large1 sub/large2
$ hg commit -m "add files"
+ Invoking status precommit hook
+ A large1
+ A normal1
+ A sub/large2
+ A sub/normal2
$ echo normal11 > normal1
$ echo normal22 > sub/normal2
$ echo large11 > large1
$ echo large22 > sub/large2
- $ hg st
+ $ hg commit -m "edit files"
+ Invoking status precommit hook
M large1
M normal1
M sub/large2
M sub/normal2
- $ hg commit -m "edit files"
+ $ hg sum --large
+ parent: 1:ce8896473775 tip
+ edit files
+ branch: default
+ commit: (clean)
+ update: (current)
+ largefiles: No remote repo
Commit preserved largefile contents.
@@ -52,17 +69,32 @@
$ hg remove normal1 large1
$ hg commit -m "remove files"
+ Invoking status precommit hook
+ R large1
+ R normal1
$ ls
sub
+ $ echo "testlargefile" > large1-test
+ $ hg add --large large1-test
+ $ hg st
+ A large1-test
+ $ hg rm large1-test
+ not removing large1-test: file has been marked for add (use forget to undo)
+ $ hg st
+ A large1-test
+ $ hg forget large1-test
+ $ hg st
+ ? large1-test
+ $ rm large1-test
Copy both largefiles and normal files (testing that status output is correct).
$ hg cp sub/normal2 normal1
$ hg cp sub/large2 large1
- $ hg st
+ $ hg commit -m "copy files"
+ Invoking status precommit hook
A large1
A normal1
- $ hg commit -m "copy files"
$ cat normal1
normal22
$ cat large1
@@ -75,6 +107,15 @@
$ hg mv sub/normal2 sub/normal4
$ hg mv sub/large2 sub/large4
$ hg commit -m "move files"
+ Invoking status precommit hook
+ A large3
+ A normal3
+ A sub/large4
+ A sub/normal4
+ R large1
+ R normal1
+ R sub/large2
+ R sub/normal2
$ cat normal3
normal22
$ cat large3
@@ -144,6 +185,11 @@
$ echo normal4 > sub/normal4
$ echo large4 > sub/large4
$ hg commit normal3 large3 sub/normal4 sub/large4 -m "edit files again"
+ Invoking status precommit hook
+ M large3
+ M normal3
+ M sub/large4
+ M sub/normal4
$ cat normal3
normal3
$ cat large3
@@ -162,6 +208,11 @@
$ echo large44 > sub/large4
$ cd sub
$ hg commit -m "edit files yet again"
+ Invoking status precommit hook
+ M large3
+ M normal3
+ M sub/large4
+ M sub/normal4
$ cat ../normal3
normal33
$ cat ../large3
@@ -226,7 +277,8 @@
Test forget on largefiles.
$ hg forget large3 large5 test.dat reallylarge ratherlarge medium
- $ hg st
+ $ hg commit -m "add/edit more largefiles"
+ Invoking status precommit hook
A sub2/large6
A sub2/large7
R large3
@@ -236,7 +288,6 @@
? ratherlarge
? reallylarge
? test.dat
- $ hg commit -m "add/edit more largefiles"
$ hg st
? large3
? large5
@@ -257,6 +308,20 @@
$ cat sub2/large7
large7
+Test addremove: verify that files that should be added as largfiles are added as
+such and that already-existing largfiles are not added as normal files by
+accident.
+
+ $ rm normal3
+ $ rm sub/large4
+ $ echo "testing addremove with patterns" > testaddremove.dat
+ $ echo "normaladdremove" > normaladdremove
+ $ hg addremove
+ removing sub/large4
+ adding testaddremove.dat as a largefile
+ removing normal3
+ adding normaladdremove
+
Clone a largefiles repo.
$ hg clone . ../b
@@ -334,10 +399,16 @@
$ echo large4-modified > sub/large4
$ echo normal3-modified > normal3
$ hg commit -m "modify normal file and largefile in repo b"
+ Invoking status precommit hook
+ M normal3
+ M sub/large4
$ cd ../d
$ echo large6-modified > sub2/large6
$ echo normal4-modified > sub/normal4
$ hg commit -m "modify normal file largefile in repo d"
+ Invoking status precommit hook
+ M sub/normal4
+ M sub2/large6
$ cd ..
$ hg clone d e
updating to branch default
@@ -354,7 +425,10 @@
added 1 changesets with 2 changes to 2 files (+1 heads)
getting changed largefiles
1 largefiles updated, 0 removed
- saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
+ Invoking status precommit hook
+ M sub/normal4
+ M sub2/large6
+ saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg
nothing to rebase
$ hg log --template '{rev}:{node|short} {desc|firstline}\n'
9:598410d3eb9a modify normal file largefile in repo d
@@ -389,59 +463,21 @@
$ hg rebase
getting changed largefiles
1 largefiles updated, 0 removed
- saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
- $ hg log
- changeset: 9:598410d3eb9a
- tag: tip
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: modify normal file largefile in repo d
-
- changeset: 8:a381d2c8c80e
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: modify normal file and largefile in repo b
-
- changeset: 7:daea875e9014
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: add/edit more largefiles
-
- changeset: 6:4355d653f84f
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: edit files yet again
-
- changeset: 5:9d5af5072dbd
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: edit files again
-
- changeset: 4:74c02385b94c
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: move files
-
- changeset: 3:9e8fbc4bce62
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: copy files
-
- changeset: 2:51a0ae4d5864
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: remove files
-
- changeset: 1:ce8896473775
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: edit files
-
- changeset: 0:30d30fe6a5be
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: add files
-
+ Invoking status precommit hook
+ M sub/normal4
+ M sub2/large6
+ saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg
+ $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
+ 9:598410d3eb9a modify normal file largefile in repo d
+ 8:a381d2c8c80e modify normal file and largefile in repo b
+ 7:daea875e9014 add/edit more largefiles
+ 6:4355d653f84f edit files yet again
+ 5:9d5af5072dbd edit files again
+ 4:74c02385b94c move files
+ 3:9e8fbc4bce62 copy files
+ 2:51a0ae4d5864 remove files
+ 1:ce8896473775 edit files
+ 0:30d30fe6a5be add files
$ cat normal3
normal3-modified
$ cat sub/normal4
@@ -457,63 +493,24 @@
$ echo large4-modified-again > sub/large4
$ hg commit -m "Modify large4 again"
+ Invoking status precommit hook
+ M sub/large4
$ hg rollback
repository tip rolled back to revision 9 (undo commit)
working directory now based on revision 9
$ hg st
M sub/large4
- $ hg log
- changeset: 9:598410d3eb9a
- tag: tip
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: modify normal file largefile in repo d
-
- changeset: 8:a381d2c8c80e
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: modify normal file and largefile in repo b
-
- changeset: 7:daea875e9014
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: add/edit more largefiles
-
- changeset: 6:4355d653f84f
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: edit files yet again
-
- changeset: 5:9d5af5072dbd
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: edit files again
-
- changeset: 4:74c02385b94c
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: move files
-
- changeset: 3:9e8fbc4bce62
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: copy files
-
- changeset: 2:51a0ae4d5864
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: remove files
-
- changeset: 1:ce8896473775
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: edit files
-
- changeset: 0:30d30fe6a5be
- user: test
- date: Thu Jan 01 00:00:00 1970 +0000
- summary: add files
-
+ $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
+ 9:598410d3eb9a modify normal file largefile in repo d
+ 8:a381d2c8c80e modify normal file and largefile in repo b
+ 7:daea875e9014 add/edit more largefiles
+ 6:4355d653f84f edit files yet again
+ 5:9d5af5072dbd edit files again
+ 4:74c02385b94c move files
+ 3:9e8fbc4bce62 copy files
+ 2:51a0ae4d5864 remove files
+ 1:ce8896473775 edit files
+ 0:30d30fe6a5be add files
$ cat sub/large4
large4-modified-again
@@ -621,6 +618,8 @@
$ cd f
$ echo "large4-merge-test" > sub/large4
$ hg commit -m "Modify large4 to test merge"
+ Invoking status precommit hook
+ M sub/large4
$ hg pull ../e
pulling from ../e
searching for changes
@@ -638,6 +637,10 @@
getting changed largefiles
1 largefiles updated, 0 removed
$ hg commit -m "Merge repos e and f"
+ Invoking status precommit hook
+ M normal3
+ M sub/normal4
+ M sub2/large6
$ cat normal3
normal3-modified
$ cat sub/normal4
@@ -654,9 +657,13 @@
$ echo large > large
$ hg add --large large
$ hg commit -m 'add largefile'
+ Invoking status precommit hook
+ A large
$ hg update -q ".^"
$ echo change >> normal3
$ hg commit -m 'some change'
+ Invoking status precommit hook
+ M normal3
created new head
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
@@ -721,10 +728,10 @@
Test that renaming a largefile results in correct output for status
$ hg rename sub/large4 large4-renamed
- $ hg st
+ $ hg commit -m "test rename output"
+ Invoking status precommit hook
A large4-renamed
R sub/large4
- $ hg commit -m "test rename output"
$ cat large4-renamed
large4-modified
$ cd sub2
@@ -740,7 +747,9 @@
$ hg init
$ echo c1 > f1
$ hg add f1
- $ hg com -m "m1"
+ $ hg commit -m "m1"
+ Invoking status precommit hook
+ A f1
$ cd ..
$ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
$ cat hg.pid >> $DAEMON_PIDS
@@ -771,7 +780,9 @@
$ hg init
$ echo c1 > f1
$ hg add --large f1
- $ hg com -m "m1"
+ $ hg commit -m "m1"
+ Invoking status precommit hook
+ A f1
$ cd ..
$ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
$ cat hg.pid >> $DAEMON_PIDS
@@ -801,7 +812,9 @@
$ hg init
$ echo c1 > f1
$ hg add f1
- $ hg com -m "m1"
+ $ hg commit -m "m1"
+ Invoking status precommit hook
+ A f1
$ cat >> .hg/hgrc <<!
> [web]
> push_ssl = false
@@ -814,7 +827,9 @@
$ cd r7
$ echo c2 > f2
$ hg add --large f2
- $ hg com -m "m2"
+ $ hg commit -m "m2"
+ Invoking status precommit hook
+ A f2
$ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
$ cat ../hg.pid >> $DAEMON_PIDS
$ hg push http://localhost:$HGPORT
@@ -824,6 +839,21 @@
[255]
$ cd ..
+putlfile errors are shown (issue3123)
+Corrupt the cached largefile in r7
+ $ echo corruption > $USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8
+ $ hg init empty
+ $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \
+ > --config 'web.allow_push=*' --config web.push_ssl=False
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg push -R r7 http://localhost:$HGPORT1
+ pushing to http://localhost:$HGPORT1/
+ searching for changes
+ remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash
+ abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/
+ [255]
+ $ rm -rf empty
+
Clone a local repository owned by another user
We have to simulate that here by setting $HOME and removing write permissions
$ ORIGHOME="$HOME"
@@ -835,6 +865,8 @@
$ dd if=/dev/urandom bs=1k count=11k > a-large-file 2> /dev/null
$ hg add --large a-large-file
$ hg commit -m "Add a large file"
+ Invoking status precommit hook
+ A a-large-file
$ cd ..
$ chmod -R a-w pubrepo
$ cd ..
@@ -861,9 +893,13 @@
$ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
$ hg add --large largefile
$ hg commit -m "commit a large file"
+ Invoking status precommit hook
+ A largefile
$ ln -s largefile largelink
$ hg add largelink
$ hg commit -m "commit a large symlink"
+ Invoking status precommit hook
+ A largelink
$ rm -f largelink
$ hg up >/dev/null
$ test -f largelink
--- a/tests/test-mq-merge.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-mq-merge.t Mon Jan 09 20:17:37 2012 -0600
@@ -149,13 +149,11 @@
-b
+a
+c
- diff --git a/a b/aa
- copy from a
- copy to aa
- --- a/a
+ diff --git a/aa b/aa
+ new file mode 100644
+ --- /dev/null
+++ b/aa
- @@ -1,1 +1,1 @@
- -b
+ @@ -0,0 +1,1 @@
+a
Check patcha2 is still a regular patch:
--- a/tests/test-mv-cp-st-diff.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-mv-cp-st-diff.t Mon Jan 09 20:17:37 2012 -0600
@@ -560,6 +560,7 @@
- parent to root: --rev . --rev 0
M a
+ b
R b
diff --git a/a b/a
@@ -611,6 +612,7 @@
- parent to branch: --rev . --rev 2
M a
+ b
A x/y
R b
@@ -906,6 +908,7 @@
- parent to root: --rev . --rev 0
M a
+ b
R b
R c
@@ -975,6 +978,7 @@
- parent to branch: --rev . --rev 2
M a
+ b
A x/y
R b
R c
--- a/tests/test-notify-changegroup.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-notify-changegroup.t Mon Jan 09 20:17:37 2012 -0600
@@ -184,19 +184,19 @@
Message-Id: <*> (glob)
To: baz, foo@bar
- changeset 84e487dddc58 in $TESTTMP/a
+ changeset 84e487dddc58 in $TESTTMP/a (glob)
details: $TESTTMP/a?cmd=changeset;node=84e487dddc58
summary: newfile
- changeset b29c7a2b6b0c in $TESTTMP/a
+ changeset b29c7a2b6b0c in $TESTTMP/a (glob)
details: $TESTTMP/a?cmd=changeset;node=b29c7a2b6b0c
summary: x
- changeset 0957c7d64886 in $TESTTMP/a
+ changeset 0957c7d64886 in $TESTTMP/a (glob)
details: $TESTTMP/a?cmd=changeset;node=0957c7d64886
summary: y
- changeset 485b4e6b0249 in $TESTTMP/a
+ changeset 485b4e6b0249 in $TESTTMP/a (glob)
details: $TESTTMP/a?cmd=changeset;node=485b4e6b0249
summary: merged
--- a/tests/test-notify.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-notify.t Mon Jan 09 20:17:37 2012 -0600
@@ -412,7 +412,7 @@
> test = False
> mbox = mbox
> EOF
- $ python -c 'print "no" * 500' >> a/a
+ $ python -c 'file("a/a", "ab").write("no" * 500 + "\n")'
$ hg --cwd a commit -A -m "long line"
$ hg --traceback --cwd b pull ../a
pulling from ../a
--- a/tests/test-rebase-named-branches.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-rebase-named-branches.t Mon Jan 09 20:17:37 2012 -0600
@@ -22,25 +22,156 @@
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd ..
-
-Rebasing descendant onto ancestor across different named branches
-
$ hg clone -q -u . a a1
$ cd a1
- $ hg branch dev
- marked working directory as branch dev
+ $ hg update 3
+ 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg branch dev-one
+ marked working directory as branch dev-one
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'dev-one named branch'
+
+ $ hg update 7
+ 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ hg branch dev-two
+ marked working directory as branch dev-two
(branches are permanent and global, did you want a bookmark?)
$ echo x > x
$ hg add x
- $ hg ci -m 'extra named branch'
+ $ hg ci -m 'dev-two named branch'
+
+ $ hg tglog
+ @ 9: 'dev-two named branch' dev-two
+ |
+ | o 8: 'dev-one named branch' dev-one
+ | |
+ o | 7: 'H'
+ | |
+ +---o 6: 'G'
+ | | |
+ o | | 5: 'F'
+ | | |
+ +---o 4: 'E'
+ | |
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+
+Branch name containing a dash (issue3181)
+
+ $ hg rebase -b dev-two -d dev-one --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 9: 'dev-two named branch' dev-two
+ |
+ o 8: 'H'
+ |
+ | o 7: 'G'
+ |/|
+ o | 6: 'F'
+ | |
+ o | 5: 'dev-one named branch' dev-one
+ | |
+ | o 4: 'E'
+ | |
+ o | 3: 'D'
+ | |
+ o | 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s dev-one -d 0 --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
$ hg tglog
- @ 8: 'extra named branch' dev
+ @ 8: 'dev-two named branch' dev-two
+ |
+ o 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg update 3
+ 3 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ hg branch dev-one
+ marked working directory as branch dev-one
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'dev-one named branch'
+
+ $ hg tglog
+ @ 9: 'dev-one named branch' dev-one
+ |
+ | o 8: 'dev-two named branch' dev-two
+ | |
+ | o 7: 'H'
+ | |
+ | | o 6: 'G'
+ | |/|
+ | o | 5: 'F'
+ | | |
+ | | o 4: 'E'
+ | |/
+ o | 3: 'D'
+ | |
+ o | 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -b 'max(branch("dev-two"))' -d dev-one --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 9: 'dev-two named branch' dev-two
+ |
+ o 8: 'H'
+ |
+ | o 7: 'G'
+ |/|
+ o | 6: 'F'
+ | |
+ o | 5: 'dev-one named branch' dev-one
+ | |
+ | o 4: 'E'
+ | |
+ o | 3: 'D'
+ | |
+ o | 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 'max(branch("dev-one"))' -d 0 --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'dev-two named branch' dev-two
|
o 7: 'H'
|
@@ -59,6 +190,7 @@
o 0: 'A'
+Rebasing descendant onto ancestor across different named branches
$ hg rebase -s 1 -d 8 --keepbranches
saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
@@ -70,7 +202,7 @@
|
o 6: 'B'
|
- o 5: 'extra named branch' dev
+ o 5: 'dev-two named branch' dev-two
|
o 4: 'H'
|
@@ -96,7 +228,7 @@
|
o 6: 'B'
|
- o 5: 'extra named branch'
+ o 5: 'dev-two named branch'
|
o 4: 'H'
|
--- a/tests/test-simplemerge.py Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-simplemerge.py Mon Jan 09 20:17:37 2012 -0600
@@ -11,8 +11,7 @@
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
import unittest
from unittest import TestCase
--- a/tests/test-symlinks.t Sun Jan 08 13:54:36 2012 +0400
+++ b/tests/test-symlinks.t Mon Jan 09 20:17:37 2012 -0600
@@ -168,11 +168,12 @@
? foo
$ hg status ../link
? foo
+ $ hg add foo
+ $ hg cp foo "$TESTTMP/link/bar"
+ foo has not been committed yet, so no copy data will be stored for bar.
$ cd ..
-
-
$ hg init b
$ cd b
$ ln -s nothing dangling