# HG changeset patch
# User Matt Harbison <matt_harbison@yahoo.com>
# Date 2015-09-30 03:29:44
# Node ID 9a466b9f9792e3ad7ae3fc6c43c3ff2e136b718d
# Parent  aca296094a29dde08062c218a9cb3271a53efcdb

largefiles: restore archiving largefiles with hgweb (issue4859)

This regressed in 7699d3212994, when trying to conditionally disable archiving
of largefiles.

I'm not sure if wrapfunction() is the right way to do this, but it seems to
work.  The mysterious issue with lfstatus getting out of sync in the proxy and
the unfiltered view crops up again here.  See the referenced cset for more info.

diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
--- a/hgext/largefiles/overrides.py
+++ b/hgext/largefiles/overrides.py
@@ -886,9 +886,19 @@ def overridearchivecmd(orig, ui, repo, d
     finally:
         repo.unfiltered().lfstatus = False
 
+def hgwebarchive(orig, web, req, tmpl):
+    web.repo.lfstatus = True
+
+    try:
+        return orig(web, req, tmpl)
+    finally:
+        web.repo.lfstatus = False
+
 def overridearchive(orig, repo, dest, node, kind, decode=True, matchfn=None,
             prefix='', mtime=None, subrepos=None):
-    if not repo.lfstatus:
+    # For some reason setting repo.lfstatus in hgwebarchive only changes the
+    # unfiltered repo's attr, so check that as well.
+    if not repo.lfstatus and not repo.unfiltered().lfstatus:
         return orig(repo, dest, node, kind, decode, matchfn, prefix, mtime,
                     subrepos)
 
diff --git a/hgext/largefiles/uisetup.py b/hgext/largefiles/uisetup.py
--- a/hgext/largefiles/uisetup.py
+++ b/hgext/largefiles/uisetup.py
@@ -119,6 +119,8 @@ def uisetup(ui):
     extensions.wrapfunction(archival, 'archive', overrides.overridearchive)
     extensions.wrapfunction(subrepo.hgsubrepo, 'archive',
                             overrides.hgsubrepoarchive)
+    extensions.wrapfunction(webcommands, 'archive',
+                            overrides.hgwebarchive)
     extensions.wrapfunction(cmdutil, 'bailifchanged',
                             overrides.overridebailifchanged)
 
diff --git a/tests/test-largefiles-wireproto.t b/tests/test-largefiles-wireproto.t
--- a/tests/test-largefiles-wireproto.t
+++ b/tests/test-largefiles-wireproto.t
@@ -15,6 +15,8 @@ of largefiles.
   > minsize=2
   > patterns=glob:**.dat
   > usercache=${USERCACHE}
+  > [web]
+  > allow_archive = zip
   > [hooks]
   > precommit=sh -c "echo \\"Invoking status precommit hook\\"; hg status"
   > EOF
@@ -215,6 +217,17 @@ Clone over http, no largefiles pulled on
   adding file changes
   added 1 changesets with 1 changes to 1 files
 
+Archive contains largefiles
+  >>> import urllib2, os
+  >>> u = 'http://localhost:%s/archive/default.zip' % os.environ['HGPORT2']
+  >>> with open('archive.zip', 'w') as f:
+  ...     f.write(urllib2.urlopen(u).read())
+  $ unzip -t archive.zip
+  Archive:  archive.zip
+      testing: empty-default/.hg_archival.txt   OK
+      testing: empty-default/f1         OK
+  No errors detected in compressed data of archive.zip.
+
 test 'verify' with remotestore:
 
   $ rm "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90