Patchwork [5,of,6] grep: invoke the file prefetch hook

login
register
mail settings
Submitter Matt Harbison
Date April 15, 2018, 6:44 a.m.
Message ID <a3702d55eb1ca64fc220.1523774649@Envy>
Download mbox | patch
Permalink /patch/31077/
State Superseded
Headers show

Comments

Matt Harbison - April 15, 2018, 6:44 a.m.
# HG changeset patch
# User Matt Harbison <matt_harbison@yahoo.com>
# Date 1523756443 14400
#      Sat Apr 14 21:40:43 2018 -0400
# Node ID a3702d55eb1ca64fc220827482e9d3a17cbfbb57
# Parent  3b0c3d4939b56ca038dbbba17da424699a6b339d
grep: invoke the file prefetch hook

Because of the way `grep` works, I don't see an easy way to prefetch everything,
so this prefetches per revision as it walks.  The message between the file/line
number and the matching line is a --verbose output.  Since I don't expect this
to be used much with lfs content, I'm not going to worry about it.

I have no idea why the second test without an explicit file doesn't find the
match.

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -2553,6 +2553,8 @@  def grep(ui, repo, pattern, *pats, **opt
         matches.setdefault(rev, {})
         matches.setdefault(parent, {})
         files = revfiles.setdefault(rev, [])
+        scmutil.fileprefetchhooks(ctx.repo(), [ctx], fns)
+
         for fn in fns:
             flog = getfile(fn)
             try:
diff --git a/tests/test-lfs-serve.t b/tests/test-lfs-serve.t
--- a/tests/test-lfs-serve.t
+++ b/tests/test-lfs-serve.t
@@ -430,6 +430,34 @@  Only the files required by diff are pref
   @@ -0,0 +1,1 @@
   +this is an lfs file too
 
+Grep will prefetch files, as needed.
+
+  $ rm -r $TESTTMP/bulkfetch/.hg/store/lfs
+  $ hg -R $TESTTMP/bulkfetch grep -v lfs $TESTTMP/bulkfetch/lfs2.txt
+  lfs: assuming remote store: http://localhost:$HGPORT/.git/info/lfs
+  lfs: assuming remote store: http://localhost:$HGPORT/.git/info/lfs
+  lfs: downloading a82f1c5cea0d40e3bb3a849686bb4e6ae47ca27e614de55c1ed0325698ef68de (25 bytes)
+  lfs: processed: a82f1c5cea0d40e3bb3a849686bb4e6ae47ca27e614de55c1ed0325698ef68de
+  lfs: found a82f1c5cea0d40e3bb3a849686bb4e6ae47ca27e614de55c1ed0325698ef68de in the local lfs store
+  lfs2.txt:5:lfs: found a82f1c5cea0d40e3bb3a849686bb4e6ae47ca27e614de55c1ed0325698ef68de in the local lfs store
+  this is another lfs file
+  $ rm -r $TESTTMP/bulkfetch/.hg/store/lfs
+  $ hg -R $TESTTMP/bulkfetch grep -v lfs
+  lfs: assuming remote store: http://localhost:$HGPORT/.git/info/lfs
+  lfs: assuming remote store: http://localhost:$HGPORT/.git/info/lfs
+  lfs: downloading bed80f00180ac404b843628ab56a1c1984d6145c391cd1628a7dd7d2598d71fc (23 bytes)
+  lfs: processed: bed80f00180ac404b843628ab56a1c1984d6145c391cd1628a7dd7d2598d71fc
+  lfs: assuming remote store: http://localhost:$HGPORT/.git/info/lfs
+  lfs: downloading a82f1c5cea0d40e3bb3a849686bb4e6ae47ca27e614de55c1ed0325698ef68de (25 bytes)
+  lfs: processed: a82f1c5cea0d40e3bb3a849686bb4e6ae47ca27e614de55c1ed0325698ef68de
+  lfs: assuming remote store: http://localhost:$HGPORT/.git/info/lfs
+  lfs: need to transfer 2 objects (44 bytes)
+  lfs: downloading cf1b2787b74e66547d931b6ebe28ff63303e803cb2baa14a8f57c4383d875782 (20 bytes)
+  lfs: processed: cf1b2787b74e66547d931b6ebe28ff63303e803cb2baa14a8f57c4383d875782
+  lfs: downloading d96eda2c74b56e95cfb5ffb66b6503e198cc6fc4a09dc877de925feebc65786e (24 bytes)
+  lfs: processed: d96eda2c74b56e95cfb5ffb66b6503e198cc6fc4a09dc877de925feebc65786e
+  [1]
+
 #endif
 
   $ $PYTHON $TESTDIR/killdaemons.py $DAEMON_PIDS