# HG changeset patch # User Matt Mackall # Date 1322776630 21600 # Node ID 36d7a0c7505f7b526303bb140f7bc106f7df457e # Parent 2555f441a32fcaf002652978b04675b7572c5207# Parent 2f2ca019569feddfc39eae4f1cda0b3da62d4e00 merge with stable diff -r 2555f441a32f -r 36d7a0c7505f .hgsigs --- a/.hgsigs Thu Dec 01 01:42:03 2011 -0600 +++ b/.hgsigs Thu Dec 01 15:57:10 2011 -0600 @@ -45,3 +45,4 @@ 351a9292e430e35766c552066ed3e87c557b803b 0 iD8DBQBOh3zUywK+sNU5EO8RApFMAKCD3Y/u3avDFndznwqfG5UeTHMlvACfUivPIVQZyDZnhZMq0UhC6zhCEQg= 384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI= 41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4= +195dbd1cef0c2f9f8bcf4ea303238105f716bda3 0 iD8DBQBO1/fWywK+sNU5EO8RAmoPAKCR5lpv1D6JLURHD8KVLSV4GRVEBgCgnd0Sy78ligNfqAMafmACRDvj7vo= diff -r 2555f441a32f -r 36d7a0c7505f .hgtags --- a/.hgtags Thu Dec 01 01:42:03 2011 -0600 +++ b/.hgtags Thu Dec 01 15:57:10 2011 -0600 @@ -57,3 +57,4 @@ 351a9292e430e35766c552066ed3e87c557b803b 1.9.3 384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc 41453d55b481ddfcc1dacb445179649e24ca861d 2.0 +195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1 diff -r 2555f441a32f -r 36d7a0c7505f hgext/convert/subversion.py --- a/hgext/convert/subversion.py Thu Dec 01 01:42:03 2011 -0600 +++ b/hgext/convert/subversion.py Thu Dec 01 15:57:10 2011 -0600 @@ -50,10 +50,21 @@ mod = '/' + parts[1] return parts[0][4:], mod, int(revnum) +def quote(s): + # As of svn 1.7, many svn calls expect "canonical" paths. In + # theory, we should call svn.core.*canonicalize() on all paths + # before passing them to the API. Instead, we assume the base url + # is canonical and copy the behaviour of svn URL encoding function + # so we can extend it safely with new components. The "safe" + # characters were taken from the "svn_uri__char_validity" table in + # libsvn_subr/path.c. + return urllib.quote(s, "!$&'()*+,-./:=@_~") + def geturl(path): try: return svn.client.url_from_path(svn.core.svn_path_canonicalize(path)) except SubversionException: + # svn.client.url_from_path() fails with local repositories pass if os.path.isdir(path): path = os.path.normpath(os.path.abspath(path)) @@ -62,8 +73,8 @@ # Module URL is later compared with the repository URL returned # by svn API, which is UTF-8. path = encoding.tolocal(path) - return 'file://%s' % urllib.quote(path) - return path + path = 'file://%s' % quote(path) + return svn.core.svn_path_canonicalize(path) def optrev(number): optrev = svn.core.svn_opt_revision_t() @@ -306,7 +317,7 @@ def exists(self, path, optrev): try: - svn.client.ls(self.url.rstrip('/') + '/' + urllib.quote(path), + svn.client.ls(self.url.rstrip('/') + '/' + quote(path), optrev, False, self.ctx) return True except SubversionException: @@ -358,7 +369,7 @@ # Check if branches bring a few more heads to the list if branches: rpath = self.url.strip('/') - branchnames = svn.client.ls(rpath + '/' + urllib.quote(branches), + branchnames = svn.client.ls(rpath + '/' + quote(branches), rev, False, self.ctx) for branch in branchnames.keys(): module = '%s/%s/%s' % (oldmodule, branches, branch) @@ -394,7 +405,7 @@ else: # Perform a full checkout on roots uuid, module, revnum = revsplit(rev) - entries = svn.client.ls(self.baseurl + urllib.quote(module), + entries = svn.client.ls(self.baseurl + quote(module), optrev(revnum), True, self.ctx) files = [n for n, e in entries.iteritems() if e.kind == svn.core.svn_node_file] @@ -595,7 +606,7 @@ """Reparent the svn transport and return the previous parent.""" if self.prevmodule == module: return module - svnurl = self.baseurl + urllib.quote(module) + svnurl = self.baseurl + quote(module) prevmodule = self.prevmodule if prevmodule is None: prevmodule = '' @@ -866,7 +877,7 @@ """Enumerate all files in path at revnum, recursively.""" path = path.strip('/') pool = Pool() - rpath = '/'.join([self.baseurl, urllib.quote(path)]).strip('/') + rpath = '/'.join([self.baseurl, quote(path)]).strip('/') entries = svn.client.ls(rpath, optrev(revnum), True, self.ctx, pool) if path: path += '/' diff -r 2555f441a32f -r 36d7a0c7505f hgext/convert/transport.py --- a/hgext/convert/transport.py Thu Dec 01 01:42:03 2011 -0600 +++ b/hgext/convert/transport.py Thu Dec 01 15:57:10 2011 -0600 @@ -86,7 +86,7 @@ self.client.config = svn_config try: self.ra = svn.client.open_ra_session( - self.svn_url.encode('utf8'), + self.svn_url, self.client, self.pool) except SubversionException, (inst, num): if num in (svn.core.SVN_ERR_RA_ILLEGAL_URL, diff -r 2555f441a32f -r 36d7a0c7505f hgext/largefiles/overrides.py --- a/hgext/largefiles/overrides.py Thu Dec 01 01:42:03 2011 -0600 +++ b/hgext/largefiles/overrides.py Thu Dec 01 15:57:10 2011 -0600 @@ -373,7 +373,8 @@ origcopyfile = util.copyfile copiedfiles = [] def override_copyfile(src, dest): - if lfutil.shortname in src and lfutil.shortname in dest: + if (lfutil.shortname in src and + dest.startswith(repo.wjoin(lfutil.shortname))): destlfile = dest.replace(lfutil.shortname, '') if not opts['force'] and os.path.exists(destlfile): raise IOError('', @@ -388,18 +389,19 @@ lfdirstate = lfutil.openlfdirstate(ui, repo) for (src, dest) in copiedfiles: - if lfutil.shortname in src and lfutil.shortname in dest: - srclfile = src.replace(lfutil.shortname, '') - destlfile = dest.replace(lfutil.shortname, '') + if (lfutil.shortname in src and + dest.startswith(repo.wjoin(lfutil.shortname))): + srclfile = src.replace(repo.wjoin(lfutil.standin('')), '') + destlfile = dest.replace(repo.wjoin(lfutil.standin('')), '') destlfiledir = os.path.dirname(destlfile) or '.' if not os.path.isdir(destlfiledir): os.makedirs(destlfiledir) if rename: - os.rename(srclfile, destlfile) - lfdirstate.remove(repo.wjoin(srclfile)) + os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile)) + lfdirstate.remove(srclfile) else: util.copyfile(srclfile, destlfile) - lfdirstate.add(repo.wjoin(destlfile)) + lfdirstate.add(destlfile) lfdirstate.write() except util.Abort, e: if str(e) != 'no files to copy': diff -r 2555f441a32f -r 36d7a0c7505f mercurial/bundlerepo.py --- a/mercurial/bundlerepo.py Thu Dec 01 01:42:03 2011 -0600 +++ b/mercurial/bundlerepo.py Thu Dec 01 15:57:10 2011 -0600 @@ -266,6 +266,10 @@ def getcwd(self): return os.getcwd() # always outside the repo + def _writebranchcache(self, branches, tip, tiprev): + # don't overwrite the disk cache with bundle-augmented data + pass + def instance(ui, path, create): if create: raise util.Abort(_('cannot create new bundle repository')) diff -r 2555f441a32f -r 36d7a0c7505f mercurial/cmdutil.py --- a/mercurial/cmdutil.py Thu Dec 01 01:42:03 2011 -0600 +++ b/mercurial/cmdutil.py Thu Dec 01 15:57:10 2011 -0600 @@ -23,7 +23,14 @@ """ choice = {} debugchoice = {} - for e in table.keys(): + + if cmd in table: + # short-circuit exact matches, "log" alias beats "^log|history" + keys = [cmd] + else: + keys = table.keys() + + for e in keys: aliases = parsealiases(e) found = None if cmd in aliases: diff -r 2555f441a32f -r 36d7a0c7505f tests/test-alias.t --- a/tests/test-alias.t Thu Dec 01 01:42:03 2011 -0600 +++ b/tests/test-alias.t Thu Dec 01 15:57:10 2011 -0600 @@ -397,3 +397,11 @@ use "hg help" for the full list of commands or "hg -v" for details [255] +This should show id: + + $ hg --config alias.log='id' log + 000000000000 tip + +This shouldn't: + + $ hg --config alias.log='id' history diff -r 2555f441a32f -r 36d7a0c7505f tests/test-largefiles.t --- a/tests/test-largefiles.t Thu Dec 01 01:42:03 2011 -0600 +++ b/tests/test-largefiles.t Thu Dec 01 15:57:10 2011 -0600 @@ -53,10 +53,13 @@ $ ls sub -Copy both largefiles and normal files. +Copy both largefiles and normal files (testing that status output is correct). $ hg cp sub/normal2 normal1 $ hg cp sub/large2 large1 + $ hg st + A large1 + A normal1 $ hg commit -m "copy files" $ cat normal1 normal22 @@ -695,7 +698,22 @@ large6-modified $ cat sub2/large7 large7 - $ cd .. + +Test that renaming a largefile results in correct output for status + + $ hg rename sub/large4 large4-renamed + $ hg st + A large4-renamed + R sub/large4 + $ hg commit -m "test rename output" + $ cat large4-renamed + large4-modified + $ cd sub2 + $ hg rename large6 large6-renamed + $ hg st + A sub2/large6-renamed + R sub2/large6 + $ cd ../.. vanilla clients not locked out from largefiles servers on vanilla repos $ mkdir r1