Patchwork hgweb: refresh repository using URL not path (issue4323)

login
register
mail settings
Submitter Gregory Szorc
Date Aug. 18, 2014, 7:18 p.m.
Message ID <36a6050a8083d5e7a2c1.1408389529@vm-ubuntu-main.gateway.sonic.net>
Download mbox | patch
Permalink /patch/5458/
State Accepted
Headers show

Comments

Gregory Szorc - Aug. 18, 2014, 7:18 p.m.
# HG changeset patch
# User Gregory Szorc <gregory.szorc@gmail.com>
# Date 1408389177 25200
#      Mon Aug 18 12:12:57 2014 -0700
# Node ID 36a6050a8083d5e7a2c1c78b1d9ec4dbef7ddeba
# Parent  8dda6f6ff564d8fe6ac7b8ce4c74eb9bfb5de14a
hgweb: refresh repository using URL not path (issue4323)

hgweb detects out-of-date repository instances (using a highly
suspect mechanism that should probably be fixed) and obtains a new
repository object if needed.

This patch changes the repository object copy to use the repo URL
(instead of path). This preserves more information about the source
repository and allows bundles to be served through hgweb.

A test verifying that bundles can now be served properly via
`hg serve` has been added.
Augie Fackler - Aug. 18, 2014, 10:30 p.m.
On Mon, Aug 18, 2014 at 12:18:49PM -0700, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc@gmail.com>
> # Date 1408389177 25200
> #      Mon Aug 18 12:12:57 2014 -0700
> # Node ID 36a6050a8083d5e7a2c1c78b1d9ec4dbef7ddeba
> # Parent  8dda6f6ff564d8fe6ac7b8ce4c74eb9bfb5de14a
> hgweb: refresh repository using URL not path (issue4323)

Queued, thanks.

>
> hgweb detects out-of-date repository instances (using a highly
> suspect mechanism that should probably be fixed) and obtains a new
> repository object if needed.
>
> This patch changes the repository object copy to use the repo URL
> (instead of path). This preserves more information about the source
> repository and allows bundles to be served through hgweb.
>
> A test verifying that bundles can now be served properly via
> `hg serve` has been added.
>
> diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
> --- a/mercurial/hgweb/hgweb_mod.py
> +++ b/mercurial/hgweb/hgweb_mod.py
> @@ -109,9 +109,9 @@ class hgweb(object):
>          st = get_stat(self.repo.spath)
>          # compare changelog size in addition to mtime to catch
>          # rollbacks made less than a second ago
>          if st.st_mtime != self.mtime or st.st_size != self.size:
> -            r = hg.repository(self.repo.baseui, self.repo.root)
> +            r = hg.repository(self.repo.baseui, self.repo.url())
>              self.repo = self._getview(r)
>              self.maxchanges = int(self.config("web", "maxchanges", 10))
>              self.stripecount = int(self.config("web", "stripes", 1))
>              self.maxshortchanges = int(self.config("web", "maxshortchanges",
> diff --git a/tests/test-hgweb-bundle.t b/tests/test-hgweb-bundle.t
> new file mode 100644
> --- /dev/null
> +++ b/tests/test-hgweb-bundle.t
> @@ -0,0 +1,37 @@
> +#require serve
> +
> +  $ hg init server
> +  $ cd server
> +  $ cat >> .hg/hgrc << EOF
> +  > [extensions]
> +  > strip=
> +  > EOF
> +
> +  $ echo 1 > foo
> +  $ hg commit -A -m 'first'
> +  adding foo
> +  $ echo 2 > bar
> +  $ hg commit -A -m 'second'
> +  adding bar
> +
> +Produce a bundle to use
> +
> +  $ hg strip -r 1
> +  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
> +  saved backup bundle to $TESTTMP/server/.hg/strip-backup/ed602e697e0f-backup.hg (glob)
> +
> +Serve from a bundle file
> +
> +  $ hg serve -R .hg/strip-backup/ed602e697e0f-backup.hg -d -p $HGPORT --pid-file=hg.pid
> +  $ cat hg.pid >> $DAEMON_PIDS
> +
> +Ensure we're serving from the bundle
> +
> +  $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/?style=raw')
> +  200 Script output follows
> +
> +
> +  -rw-r--r-- 2 bar
> +  -rw-r--r-- 2 foo
> +
> +
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
--- a/mercurial/hgweb/hgweb_mod.py
+++ b/mercurial/hgweb/hgweb_mod.py
@@ -109,9 +109,9 @@  class hgweb(object):
         st = get_stat(self.repo.spath)
         # compare changelog size in addition to mtime to catch
         # rollbacks made less than a second ago
         if st.st_mtime != self.mtime or st.st_size != self.size:
-            r = hg.repository(self.repo.baseui, self.repo.root)
+            r = hg.repository(self.repo.baseui, self.repo.url())
             self.repo = self._getview(r)
             self.maxchanges = int(self.config("web", "maxchanges", 10))
             self.stripecount = int(self.config("web", "stripes", 1))
             self.maxshortchanges = int(self.config("web", "maxshortchanges",
diff --git a/tests/test-hgweb-bundle.t b/tests/test-hgweb-bundle.t
new file mode 100644
--- /dev/null
+++ b/tests/test-hgweb-bundle.t
@@ -0,0 +1,37 @@ 
+#require serve
+
+  $ hg init server
+  $ cd server
+  $ cat >> .hg/hgrc << EOF
+  > [extensions]
+  > strip=
+  > EOF
+
+  $ echo 1 > foo
+  $ hg commit -A -m 'first'
+  adding foo
+  $ echo 2 > bar
+  $ hg commit -A -m 'second'
+  adding bar
+
+Produce a bundle to use
+
+  $ hg strip -r 1
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  saved backup bundle to $TESTTMP/server/.hg/strip-backup/ed602e697e0f-backup.hg (glob)
+
+Serve from a bundle file
+
+  $ hg serve -R .hg/strip-backup/ed602e697e0f-backup.hg -d -p $HGPORT --pid-file=hg.pid
+  $ cat hg.pid >> $DAEMON_PIDS
+
+Ensure we're serving from the bundle
+
+  $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/?style=raw')
+  200 Script output follows
+  
+  
+  -rw-r--r-- 2 bar
+  -rw-r--r-- 2 foo
+  
+