merge with i18n stable
authorMatt Mackall <mpm@selenic.com>
Tue, 24 Jul 2012 12:36:40 -0500
branchstable
changeset 17240 ffc49100151b
parent 17238 57a47190e96c (diff)
parent 17239 848a1c1e51cd (current diff)
child 17241 c2f13180001f
merge with i18n
--- a/hgext/largefiles/__init__.py	Mon Jul 23 20:38:33 2012 +0200
+++ b/hgext/largefiles/__init__.py	Tue Jul 24 12:36:40 2012 -0500
@@ -92,6 +92,8 @@
 import reposetup
 import uisetup
 
+testedwith = 'internal'
+
 reposetup = reposetup.reposetup
 uisetup = uisetup.uisetup
 
--- a/hgext/largefiles/overrides.py	Mon Jul 23 20:38:33 2012 +0200
+++ b/hgext/largefiles/overrides.py	Tue Jul 24 12:36:40 2012 -0500
@@ -81,9 +81,16 @@
                 ui.warn(_('%s already a largefile\n') % f)
             continue
 
-        if exact or not exists:
+        if (exact or not exists) and not lfutil.isstandin(f):
+            wfile = repo.wjoin(f)
+
+            # In case the file was removed previously, but not committed
+            # (issue3507)
+            if not os.path.exists(wfile):
+                continue
+
             abovemin = (lfsize and
-                        os.lstat(repo.wjoin(f)).st_size >= lfsize * 1024 * 1024)
+                        os.lstat(wfile).st_size >= lfsize * 1024 * 1024)
             if large or abovemin or (lfmatcher and lfmatcher(f)):
                 lfnames.append(f)
                 if ui.verbose or not exact:
@@ -1001,8 +1008,9 @@
     # we don't remove the standin in the largefiles code, preventing a very
     # confused state later.
     if missing:
+        m = [repo.wjoin(f) for f in missing]
         repo._isaddremove = True
-        removelargefiles(ui, repo, *missing, **opts)
+        removelargefiles(ui, repo, *m, **opts)
         repo._isaddremove = False
     # Call into the normal add code, and any files that *should* be added as
     # largefiles will be
--- a/hgext/largefiles/reposetup.py	Mon Jul 23 20:38:33 2012 +0200
+++ b/hgext/largefiles/reposetup.py	Tue Jul 24 12:36:40 2012 -0500
@@ -338,15 +338,18 @@
                                     lfutil.updatestandin(self,
                                         lfutil.standin(lfile))
                                     lfdirstate.normal(lfile)
-                    for lfile in lfdirstate:
-                        if lfile in modifiedfiles:
-                            if (not os.path.exists(repo.wjoin(
-                               lfutil.standin(lfile)))) or \
-                               (not os.path.exists(repo.wjoin(lfile))):
-                                lfdirstate.drop(lfile)
 
                     result = orig(text=text, user=user, date=date, match=match,
                                     force=force, editor=editor, extra=extra)
+
+                    if result is not None:
+                        for lfile in lfdirstate:
+                            if lfile in modifiedfiles:
+                                if (not os.path.exists(repo.wjoin(
+                                   lfutil.standin(lfile)))) or \
+                                   (not os.path.exists(repo.wjoin(lfile))):
+                                    lfdirstate.drop(lfile)
+
                     # This needs to be after commit; otherwise precommit hooks
                     # get the wrong status
                     lfdirstate.write()
--- a/mercurial/encoding.py	Mon Jul 23 20:38:33 2012 +0200
+++ b/mercurial/encoding.py	Tue Jul 24 12:36:40 2012 -0500
@@ -168,8 +168,9 @@
 def lower(s):
     "best-effort encoding-aware case-folding of local string s"
     try:
-        return s.encode('ascii').lower()
-    except UnicodeError:
+        s.decode('ascii') # throw exception for non-ASCII character
+        return s.lower()
+    except UnicodeDecodeError:
         pass
     try:
         if isinstance(s, localstr):
@@ -189,6 +190,11 @@
 def upper(s):
     "best-effort encoding-aware case-folding of local string s"
     try:
+        s.decode('ascii') # throw exception for non-ASCII character
+        return s.upper()
+    except UnicodeDecodeError:
+        pass
+    try:
         if isinstance(s, localstr):
             u = s._utf8.decode("utf-8")
         else:
--- a/mercurial/util.py	Mon Jul 23 20:38:33 2012 +0200
+++ b/mercurial/util.py	Tue Jul 24 12:36:40 2012 -0500
@@ -816,6 +816,8 @@
 
         # delegated methods
         self.write = self._fp.write
+        self.seek = self._fp.seek
+        self.tell = self._fp.tell
         self.fileno = self._fp.fileno
 
     def close(self):
--- a/tests/test-largefiles.t	Mon Jul 23 20:38:33 2012 +0200
+++ b/tests/test-largefiles.t	Tue Jul 24 12:36:40 2012 -0500
@@ -370,6 +370,146 @@
   removing normal3
   adding normaladdremove
 
+Test addremove with -R
+
+  $ hg up -C
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  1 largefiles updated, 0 removed
+  $ rm normal3
+  $ rm sub/large4
+  $ echo "testing addremove with patterns" > testaddremove.dat
+  $ echo "normaladdremove" > normaladdremove
+  $ cd ..
+  $ hg -R a addremove
+  removing sub/large4
+  adding a/testaddremove.dat as a largefile (glob)
+  removing normal3
+  adding normaladdremove
+  $ cd a
+
+Test 3364
+  $ hg clone . ../addrm
+  updating to branch default
+  5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  3 largefiles updated, 0 removed
+  $ cd ../addrm
+  $ cat >> .hg/hgrc <<EOF
+  > [hooks]
+  > post-commit.stat=sh -c "echo \"Invoking status postcommit hook\"; hg status -A"
+  > EOF
+  $ touch foo
+  $ hg add --large foo
+  $ hg ci -m "add foo"
+  Invoking status precommit hook
+  A foo
+  Invoking status postcommit hook
+  C foo
+  C normal3
+  C sub/large4
+  C sub/normal4
+  C sub2/large6
+  C sub2/large7
+  $ rm foo
+  $ hg st
+  ! foo
+hmm.. no precommit invoked, but there is a postcommit??
+  $ hg ci -m "will not checkin"
+  nothing changed
+  Invoking status postcommit hook
+  ! foo
+  C normal3
+  C sub/large4
+  C sub/normal4
+  C sub2/large6
+  C sub2/large7
+  [1]
+  $ hg addremove
+  removing foo
+  $ hg st
+  R foo
+  $ hg ci -m "used to say nothing changed"
+  Invoking status precommit hook
+  R foo
+  Invoking status postcommit hook
+  C normal3
+  C sub/large4
+  C sub/normal4
+  C sub2/large6
+  C sub2/large7
+  $ hg st
+
+Test 3507 (both normal files and largefiles were a problem)
+
+  $ touch normal
+  $ touch large
+  $ hg add normal
+  $ hg add --large large
+  $ hg ci -m "added"
+  Invoking status precommit hook
+  A large
+  A normal
+  Invoking status postcommit hook
+  C large
+  C normal
+  C normal3
+  C sub/large4
+  C sub/normal4
+  C sub2/large6
+  C sub2/large7
+  $ hg remove normal
+  $ hg addremove --traceback
+  $ hg ci -m "addremoved normal"
+  Invoking status precommit hook
+  R normal
+  Invoking status postcommit hook
+  C large
+  C normal3
+  C sub/large4
+  C sub/normal4
+  C sub2/large6
+  C sub2/large7
+  $ hg up -C '.^'
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  getting changed largefiles
+  0 largefiles updated, 0 removed
+  $ hg remove large
+  $ hg addremove --traceback
+  $ hg ci -m "removed large"
+  Invoking status precommit hook
+  R large
+  created new head
+  Invoking status postcommit hook
+  C normal
+  C normal3
+  C sub/large4
+  C sub/normal4
+  C sub2/large6
+  C sub2/large7
+
+Test that a standin can't be added as a large file
+
+  $ touch large
+  $ hg add --large large
+  $ hg ci -m "add"
+  Invoking status precommit hook
+  A large
+  Invoking status postcommit hook
+  C large
+  C normal
+  C normal3
+  C sub/large4
+  C sub/normal4
+  C sub2/large6
+  C sub2/large7
+  $ hg remove large
+  $ touch large
+  $ hg addremove --config largefiles.patterns=**large --traceback
+  adding large as a largefile
+
+  $ cd ../a
+
 Clone a largefiles repo.
 
   $ hg clone . ../b
@@ -988,7 +1128,8 @@
   $ cd ..
 
 putlfile errors are shown (issue3123)
-Corrupt the cached largefile in r7
+Corrupt the cached largefile in r7 and in the usercache (required for testing on vfat)
+  $ echo corruption > "$TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8"
   $ echo corruption > "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8"
   $ hg init empty
   $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \