changeset 11484:44b4873ea59b stable

Merge with i18n
author Matt Mackall <mpm@selenic.com>
date Thu, 01 Jul 2010 11:20:08 -0500
parents 34e33d50c26b (diff) 00a758086cbf (current diff)
children b602a95c21ec
files
diffstat 19 files changed, 178 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/mq.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/hgext/mq.py	Thu Jul 01 11:20:08 2010 -0500
@@ -250,6 +250,7 @@
         self.ui = ui
         self.applied_dirty = 0
         self.series_dirty = 0
+        self.added = []
         self.series_path = "series"
         self.status_path = "status"
         self.guards_path = "guards"
@@ -1622,7 +1623,7 @@
         if (len(files) > 1 or len(rev) > 1) and patchname:
             raise util.Abort(_('option "-n" not valid when importing multiple '
                                'patches'))
-        added = []
+        self.added = []
         if rev:
             # If mq patches are applied, we can only import revisions
             # that form a linear path to qbase.
@@ -1672,10 +1673,11 @@
                 se = statusentry(n, patchname)
                 self.applied.insert(0, se)
 
-                added.append(patchname)
+                self.added.append(patchname)
                 patchname = None
             self.parse_series()
             self.applied_dirty = 1
+            self.series_dirty = True
 
         for i, filename in enumerate(files):
             if existing:
@@ -1709,13 +1711,10 @@
                 index = self.full_series_end() + i
                 self.full_series[index:index] = [patchname]
             self.parse_series()
+            self.series_dirty = True
             self.ui.warn(_("adding %s to series file\n") % patchname)
-            added.append(patchname)
+            self.added.append(patchname)
             patchname = None
-        self.series_dirty = 1
-        qrepo = self.qrepo()
-        if qrepo:
-            qrepo[None].add(added)
 
 def delete(ui, repo, *patches, **opts):
     """remove patches from queue
@@ -1805,10 +1804,15 @@
     using the --name flag.
     """
     q = repo.mq
-    q.qimport(repo, filename, patchname=opts['name'],
+    try:
+        q.qimport(repo, filename, patchname=opts['name'],
               existing=opts['existing'], force=opts['force'], rev=opts['rev'],
               git=opts['git'])
-    q.save_dirty()
+    finally:
+        q.save_dirty()
+        qrepo = q.qrepo()
+        if qrepo:
+            qrepo[None].add(q.added)
 
     if opts.get('push') and not opts.get('rev'):
         return q.push(repo, None)
--- a/mercurial/cmdutil.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/mercurial/cmdutil.py	Thu Jul 01 11:20:08 2010 -0500
@@ -687,7 +687,6 @@
         self.patch = patch
         self.diffopts = diffopts
         self.header = {}
-        self.doneheader = False
         self.hunk = {}
         self.lastheader = None
         self.footer = None
@@ -906,9 +905,9 @@
                 if self.buffered:
                     self.header[ctx.rev()] = h
                 else:
-                    if not self.doneheader:
+                    if self.lastheader != h:
+                        self.lastheader = h
                         self.ui.write(h)
-                        self.doneheader = True
 
             # write changeset metadata, then patch if requested
             key = types['changeset']
--- a/mercurial/hook.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/mercurial/hook.py	Thu Jul 01 11:20:08 2010 -0500
@@ -98,7 +98,10 @@
         cwd = repo.root
     else:
         cwd = os.getcwd()
-    r = util.system(cmd, environ=env, cwd=cwd)
+    if 'HG_URL' in env and env['HG_URL'].startswith('remote:http'):
+        r = util.system(cmd, environ=env, cwd=cwd, out=ui)
+    else:
+        r = util.system(cmd, environ=env, cwd=cwd)
     if r:
         desc, r = util.explain_exit(r)
         if throw:
--- a/mercurial/merge.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/mercurial/merge.py	Thu Jul 01 11:20:08 2010 -0500
@@ -167,7 +167,7 @@
     m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
     copied = set(copy.values())
 
-    if not overwrite and '.hgsubstate' in m1:
+    if '.hgsubstate' in m1:
         # check whether sub state is modified
         for s in p1.substate:
             if p1.sub(s).dirty():
@@ -182,7 +182,9 @@
             rflags = fmerge(f, f, f)
             a = ma.get(f, nullid)
             if n == m2[f] or m2[f] == a: # same or local newer
-                if m1.flags(f) != rflags:
+                # is file locally modified or flags need changing?
+                # dirstate flags may need to be made current
+                if m1.flags(f) != rflags or n[20:]:
                     act("update permissions", "e", f, rflags)
             elif n == a: # remote newer
                 act("remote is newer", "g", f, rflags)
--- a/mercurial/minirst.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/mercurial/minirst.py	Thu Jul 01 11:20:08 2010 -0500
@@ -36,7 +36,13 @@
 """
 
 import re, sys
-import util
+import util, encoding
+
+def replace(text, substs):
+    utext = text.decode(encoding.encoding)
+    for f, t in substs:
+        utext = utext.replace(f, t)
+    return utext.encode(encoding.encoding)
 
 def findblocks(text):
     """Find continuous blocks of lines in text.
@@ -251,21 +257,22 @@
 
 
 def inlineliterals(blocks):
+    substs = [('``', '"')]
     for b in blocks:
         if b['type'] in ('paragraph', 'section'):
-            b['lines'] = [l.replace('``', '"') for l in b['lines']]
+            b['lines'] = [replace(l, substs) for l in b['lines']]
     return blocks
 
 
 def hgrole(blocks):
+    substs = [(':hg:`', '"hg '), ('`', '"')]
     for b in blocks:
         if b['type'] in ('paragraph', 'section'):
             # Turn :hg:`command` into "hg command". This also works
             # when there is a line break in the command and relies on
             # the fact that we have no stray back-quotes in the input
             # (run the blocks through inlineliterals first).
-            b['lines'] = [l.replace(':hg:`', '"hg ').replace('`', '"')
-                          for l in b['lines']]
+            b['lines'] = [replace(l, substs) for l in b['lines']]
     return blocks
 
 
--- a/mercurial/revset.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/mercurial/revset.py	Thu Jul 01 11:20:08 2010 -0500
@@ -111,10 +111,6 @@
 
 # operator methods
 
-def negate(repo, subset, x):
-    return getset(repo, subset,
-                  ('string', '-' + getstring(x, _("can't negate that"))))
-
 def stringset(repo, subset, x):
     x = repo[x].rev()
     if x == -1 and len(subset) == len(repo):
@@ -482,7 +478,6 @@
 }
 
 methods = {
-    "negate": negate,
     "range": rangeset,
     "string": stringset,
     "symbol": symbolset,
@@ -515,6 +510,9 @@
         return optimize(('range', ('string', '0'), x[1]), small)
     elif op == 'rangepost':
         return optimize(('range', x[1], ('string', 'tip')), small)
+    elif op == 'negate':
+        return optimize(('string',
+                         '-' + getstring(x[1], _("can't negate that"))), small)
     elif op in 'string symbol negate':
         return smallbonus, x # single revisions are small
     elif op == 'and' or op == 'dagrange':
--- a/mercurial/subrepo.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/mercurial/subrepo.py	Thu Jul 01 11:20:08 2010 -0500
@@ -67,19 +67,23 @@
         repo.ui.debug("  subrepo %s: %s %s\n" % (s, msg, r))
 
     for s, l in s1.items():
-        if wctx != actx and wctx.sub(s).dirty():
-            l = (l[0], l[1] + "+")
         a = sa.get(s, nullstate)
+        ld = l # local state with possible dirty flag for compares
+        if wctx.sub(s).dirty():
+            ld = (l[0], l[1] + "+")
+        if wctx == actx: # overwrite
+            a = ld
+
         if s in s2:
             r = s2[s]
-            if l == r or r == a: # no change or local is newer
+            if ld == r or r == a: # no change or local is newer
                 sm[s] = l
                 continue
-            elif l == a: # other side changed
+            elif ld == a: # other side changed
                 debug(s, "other changed, get", r)
                 wctx.sub(s).get(r)
                 sm[s] = r
-            elif l[0] != r[0]: # sources differ
+            elif ld[0] != r[0]: # sources differ
                 if repo.ui.promptchoice(
                     _(' subrepository sources for %s differ\n'
                       'use (l)ocal source (%s) or (r)emote source (%s)?')
@@ -88,7 +92,7 @@
                     debug(s, "prompt changed, get", r)
                     wctx.sub(s).get(r)
                     sm[s] = r
-            elif l[1] == a[1]: # local side is unchanged
+            elif ld[1] == a[1]: # local side is unchanged
                 debug(s, "other side changed, get", r)
                 wctx.sub(s).get(r)
                 sm[s] = r
@@ -96,7 +100,7 @@
                 debug(s, "both sides changed, merge with", r)
                 wctx.sub(s).merge(r)
                 sm[s] = l
-        elif l == a: # remote removed, local unchanged
+        elif ld == a: # remote removed, local unchanged
             debug(s, "remote removed, remove")
             wctx.sub(s).remove()
         else:
--- a/mercurial/util.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/mercurial/util.py	Thu Jul 01 11:20:08 2010 -0500
@@ -366,13 +366,16 @@
     global _hgexecutable
     _hgexecutable = path
 
-def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None):
+def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None, out=None):
     '''enhanced shell command execution.
     run with environment maybe modified, maybe in different dir.
 
     if command fails and onerr is None, return status.  if ui object,
     print error message and return status, else raise onerr object as
-    exception.'''
+    exception.
+
+    if out is specified, it is assumed to be a file-like object that has a
+    write() method. stdout and stderr will be redirected to out.'''
     def py2shell(val):
         'convert python object into string that is useful to shell'
         if val is None or val is False:
@@ -386,8 +389,17 @@
     env = dict(os.environ)
     env.update((k, py2shell(v)) for k, v in environ.iteritems())
     env['HG'] = hgexecutable()
-    rc = subprocess.call(cmd, shell=True, close_fds=closefds,
-                         env=env, cwd=cwd)
+    if out is None:
+        rc = subprocess.call(cmd, shell=True, close_fds=closefds,
+                             env=env, cwd=cwd)
+    else:
+        proc = subprocess.Popen(cmd, shell=True, close_fds=closefds,
+                                env=env, cwd=cwd, stdout=subprocess.PIPE,
+                                stderr=subprocess.STDOUT)
+        for line in proc.stdout:
+            out.write(line)
+        proc.wait()
+        rc = proc.returncode
     if sys.platform == 'OpenVMS' and rc & 1:
         rc = 0
     if rc and onerr:
--- a/setup.py	Thu Jul 01 15:25:29 2010 +0200
+++ b/setup.py	Thu Jul 01 11:20:08 2010 -0500
@@ -35,12 +35,15 @@
 import os, subprocess, time
 import shutil
 import tempfile
+from distutils import log
 from distutils.core import setup, Extension
 from distutils.dist import Distribution
 from distutils.command.build import build
+from distutils.command.build_ext import build_ext
 from distutils.command.build_py import build_py
 from distutils.spawn import spawn, find_executable
 from distutils.ccompiler import new_compiler
+from distutils.errors import CCompilerError
 
 scripts = ['hg']
 if os.name == 'nt':
@@ -209,6 +212,17 @@
 Distribution.global_options.append(('pure', None, "use pure (slow) Python "
                                     "code instead of C extensions"))
 
+class hgbuildext(build_ext):
+
+    def build_extension(self, ext):
+        try:
+            build_ext.build_extension(self, ext)
+        except CCompilerError:
+            if not hasattr(ext, 'optional') or not ext.optional:
+                raise
+            log.warn("Failed to build optional extension '%s' (skipping)",
+                     ext.name)
+
 class hgbuildpy(build_py):
 
     def finalize_options(self):
@@ -232,6 +246,7 @@
                 yield module
 
 cmdclass = {'build_mo': hgbuildmo,
+            'build_ext': hgbuildext,
             'build_py': hgbuildpy}
 
 packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert',
@@ -256,10 +271,13 @@
 if sys.platform == 'linux2' and os.uname()[2] > '2.6':
     # The inotify extension is only usable with Linux 2.6 kernels.
     # You also need a reasonably recent C library.
+    # In any case, if it fails to build the error will be skipped ('optional').
     cc = new_compiler()
     if hasfunction(cc, 'inotify_add_watch'):
-        extmodules.append(Extension('hgext.inotify.linux._inotify',
-                                     ['hgext/inotify/linux/_inotify.c']))
+        inotify = Extension('hgext.inotify.linux._inotify',
+                            ['hgext/inotify/linux/_inotify.c'])
+        inotify.optional = True
+        extmodules.append(inotify)
         packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
 
 packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo',
--- a/tests/test-command-template	Thu Jul 01 15:25:29 2010 +0200
+++ b/tests/test-command-template	Thu Jul 01 11:20:08 2010 -0500
@@ -100,6 +100,9 @@
 hg log --style=changelog > changelog
 cat changelog
 
+echo '# issue 2130'
+hg heads --style changelog
+
 echo "# keys work"
 for key in author branches date desc file_adds file_dels file_mods \
         file_copies file_copies_switch files \
--- a/tests/test-command-template.out	Thu Jul 01 15:25:29 2010 +0200
+++ b/tests/test-command-template.out	Thu Jul 01 11:20:08 2010 -0500
@@ -437,6 +437,23 @@
 	line 1 line 2
 	[1e4e1b8f71e0]
 
+# issue 2130
+2020-01-01  test  <test>
+
+	* fourth, second, third:
+	third
+	[95c24699272e] [tip]
+
+1970-01-18  person  <person>
+
+	* merge
+	[c7b487c6c50e]
+
+1970-01-17  person  <person>
+
+	* new branch
+	[32a18f097fcc] <foo>
+
 # keys work
 author: test
 author: User Name <user@hostname>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-mq-qimport-fail-cleanup	Thu Jul 01 11:20:08 2010 -0500
@@ -0,0 +1,33 @@
+#!/bin/sh
+#failed qimport of patches from files should cleanup by recording successfully
+#imported patches in series file.
+
+echo "[extensions]" >> $HGRCPATH
+echo "mq=" >> $HGRCPATH
+
+hg init repo
+cd repo
+
+echo a > a
+hg ci -Am'add a'
+
+cat >b.patch<<EOF
+diff --git a/a b/a
+--- a/a
++++ b/a
+@@ -1,1 +1,2 @@
+ a
++b
+EOF
+
+echo
+echo '#empty series'
+hg qseries
+
+echo
+echo '#qimport valid patch followed by invalid patch'
+hg qimport b.patch fakepatch
+
+echo
+echo '#valid patches before fail added to series'
+hg qseries
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-mq-qimport-fail-cleanup.out	Thu Jul 01 11:20:08 2010 -0500
@@ -0,0 +1,10 @@
+adding a
+
+#empty series
+
+#qimport valid patch followed by invalid patch
+adding b.patch to series file
+abort: unable to read fakepatch
+
+#valid patches before fail added to series
+b.patch
--- a/tests/test-push-http	Thu Jul 01 15:25:29 2010 +0200
+++ b/tests/test-push-http	Thu Jul 01 11:20:08 2010 -0500
@@ -39,11 +39,9 @@
 echo % expect success
 echo 'allow_push = *' >> .hg/hgrc
 echo '[hooks]' >> .hg/hgrc
-echo 'changegroup = python ../printenv.py changegroup 0 ../urls' >> .hg/hgrc
+echo 'changegroup = python ../printenv.py changegroup 0' >> .hg/hgrc
 req
 
-cat ../urls
-
 hg rollback
 echo % expect authorization error: all users denied
 echo '[web]' > .hg/hgrc
--- a/tests/test-push-http.out	Thu Jul 01 15:25:29 2010 +0200
+++ b/tests/test-push-http.out	Thu Jul 01 11:20:08 2010 -0500
@@ -23,8 +23,8 @@
 remote: adding manifests
 remote: adding file changes
 remote: added 1 changesets with 1 changes to 1 files
+remote: changegroup hook: HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_URL=remote:http 
 % serve errors
-changegroup hook: HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_URL=remote:http 
 rolling back to revision 0 (undo serve)
 % expect authorization error: all users denied
 abort: authorization failed
--- a/tests/test-revset	Thu Jul 01 15:25:29 2010 +0200
+++ b/tests/test-revset	Thu Jul 01 11:20:08 2010 -0500
@@ -133,3 +133,4 @@
 log '(1 and 2)::'
 log '(1 and 2):'
 log '(1 and 2):3'
+log 'sort(head(), -rev)'
--- a/tests/test-revset.out	Thu Jul 01 15:25:29 2010 +0200
+++ b/tests/test-revset.out	Thu Jul 01 11:20:08 2010 -0500
@@ -210,3 +210,13 @@
 % log '(1 and 2)::'
 % log '(1 and 2):'
 % log '(1 and 2):3'
+% log 'sort(head(), -rev)'
+9
+7
+6
+5
+4
+3
+2
+1
+0
--- a/tests/test-subrepo	Thu Jul 01 15:25:29 2010 +0200
+++ b/tests/test-subrepo	Thu Jul 01 11:20:08 2010 -0500
@@ -19,6 +19,13 @@
 hg sum
 hg ci -m1
 
+# issue 2022 - update -C
+
+echo b > s/a
+hg sum
+hg co -C 1
+hg sum
+
 echo % add sub sub
 echo ss = ss > s/.hgsub
 hg init s/ss
--- a/tests/test-subrepo.out	Thu Jul 01 15:25:29 2010 +0200
+++ b/tests/test-subrepo.out	Thu Jul 01 11:20:08 2010 -0500
@@ -8,6 +8,17 @@
 commit: 1 added, 1 subrepos
 update: (current)
 committing subrepository s
+parent: 1:7cf8cfea66e4 tip
+ 1
+branch: default
+commit: 1 subrepos
+update: (current)
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+parent: 1:7cf8cfea66e4 tip
+ 1
+branch: default
+commit: (clean)
+update: (current)
 % add sub sub
 parent: 1:7cf8cfea66e4 tip
  1