Patchwork [3,of,4,V2] changegroup: refactor addchangegroup to do files in a seperate function

login
register
mail settings
Submitter Durham Goode
Date May 7, 2013, 3:14 a.m.
Message ID <dbdfdfcc9b14728cee94.1367896489@dev350.prn1.facebook.com>
Download mbox | patch
Permalink /patch/1579/
State Changes Requested, archived
Delegated to: Augie Fackler
Headers show

Comments

Durham Goode - May 7, 2013, 3:14 a.m.
# HG changeset patch
# User Durham Goode <durham@fb.com>
# Date 1367430651 25200
#      Wed May 01 10:50:51 2013 -0700
# Node ID dbdfdfcc9b14728cee940dd9f96398561bed0802
# Parent  9557401c5bab0a37d2e6eceb1fd13c66a75463f0
changegroup: refactor addchangegroup to do files in a seperate function

This moves the filelog portion of addchangegroup to a separate function.
This allows extensions to override just the file portion of addchangegroup.
For example, if an extension allows a repo to not have all of the file history
this wrap point lets it change how the repo accepts incoming file revisions.

No logic is changed in this commit.
Augie Fackler - May 7, 2013, 3:28 p.m.
On Mon, May 06, 2013 at 08:14:49PM -0700, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham@fb.com>
> # Date 1367430651 25200
> #      Wed May 01 10:50:51 2013 -0700
> # Node ID dbdfdfcc9b14728cee940dd9f96398561bed0802
> # Parent  9557401c5bab0a37d2e6eceb1fd13c66a75463f0
> changegroup: refactor addchangegroup to do files in a seperate function
>
> This moves the filelog portion of addchangegroup to a separate function.
> This allows extensions to override just the file portion of addchangegroup.
> For example, if an extension allows a repo to not have all of the file history
> this wrap point lets it change how the repo accepts incoming file revisions.
>
> No logic is changed in this commit.

This strikes me as a little bit of a bummer, because in abstract I'd
like to see the notion of a filelog hidden from localrepo so that you
could have a RepositoryStore that wasn't at all revlog backed, but
this certainly isn't worse than what we have.

>
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -2318,41 +2318,10 @@
>              pr.total = efiles
>              source.callback = None
>
> -            while True:
> -                chunkdata = source.filelogheader()
> -                if not chunkdata:
> -                    break
> -                f = chunkdata["filename"]
> -                self.ui.debug("adding %s revisions\n" % f)
> -                pr()
> -                fl = self.file(f)
> -                o = len(fl)
> -                if not fl.addgroup(source, revmap, trp):
> -                    raise util.Abort(_("received file revlog group is empty"))
> -                revisions += len(fl) - o
> -                files += 1
> -                if f in needfiles:
> -                    needs = needfiles[f]
> -                    for new in xrange(o, len(fl)):
> -                        n = fl.node(new)
> -                        if n in needs:
> -                            needs.remove(n)
> -                        else:
> -                            raise util.Abort(
> -                                _("received spurious file revlog entry"))
> -                    if not needs:
> -                        del needfiles[f]
> -            self.ui.progress(_('files'), None)
> -
> -            for f, needs in needfiles.iteritems():
> -                fl = self.file(f)
> -                for n in needs:
> -                    try:
> -                        fl.rev(n)
> -                    except error.LookupError:
> -                        raise util.Abort(
> -                            _('missing file data for %s:%s - run hg verify') %
> -                            (f, hex(n)))
> +            newrevs, newfiles = self.addchangegroupfiles(source, revmap, trp,
> +                                                         pr, needfiles)
> +            revisions += newrevs
> +            files += newfiles
>
>              dh = 0
>              if oldheads:
> @@ -2432,6 +2401,47 @@
>          else:
>              return dh + 1
>
> +    def addchangegroupfiles(self, source, revmap, trp, pr, needfiles):
> +        revisions = 0
> +        files = 0
> +        while True:
> +            chunkdata = source.filelogheader()
> +            if not chunkdata:
> +                break
> +            f = chunkdata["filename"]
> +            self.ui.debug("adding %s revisions\n" % f)
> +            pr()
> +            fl = self.file(f)
> +            o = len(fl)
> +            if not fl.addgroup(source, revmap, trp):
> +                raise util.Abort(_("received file revlog group is empty"))
> +            revisions += len(fl) - o
> +            files += 1
> +            if f in needfiles:
> +                needs = needfiles[f]
> +                for new in xrange(o, len(fl)):
> +                    n = fl.node(new)
> +                    if n in needs:
> +                        needs.remove(n)
> +                    else:
> +                        raise util.Abort(
> +                            _("received spurious file revlog entry"))
> +                if not needs:
> +                    del needfiles[f]
> +        self.ui.progress(_('files'), None)
> +
> +        for f, needs in needfiles.iteritems():
> +            fl = self.file(f)
> +            for n in needs:
> +                try:
> +                    fl.rev(n)
> +                except error.LookupError:
> +                    raise util.Abort(
> +                        _('missing file data for %s:%s - run hg verify') %
> +                        (f, hex(n)))
> +
> +        return revisions, files
> +
>      def stream_in(self, remote, requirements):
>          lock = self.lock()
>          try:
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -2318,41 +2318,10 @@ 
             pr.total = efiles
             source.callback = None
 
-            while True:
-                chunkdata = source.filelogheader()
-                if not chunkdata:
-                    break
-                f = chunkdata["filename"]
-                self.ui.debug("adding %s revisions\n" % f)
-                pr()
-                fl = self.file(f)
-                o = len(fl)
-                if not fl.addgroup(source, revmap, trp):
-                    raise util.Abort(_("received file revlog group is empty"))
-                revisions += len(fl) - o
-                files += 1
-                if f in needfiles:
-                    needs = needfiles[f]
-                    for new in xrange(o, len(fl)):
-                        n = fl.node(new)
-                        if n in needs:
-                            needs.remove(n)
-                        else:
-                            raise util.Abort(
-                                _("received spurious file revlog entry"))
-                    if not needs:
-                        del needfiles[f]
-            self.ui.progress(_('files'), None)
-
-            for f, needs in needfiles.iteritems():
-                fl = self.file(f)
-                for n in needs:
-                    try:
-                        fl.rev(n)
-                    except error.LookupError:
-                        raise util.Abort(
-                            _('missing file data for %s:%s - run hg verify') %
-                            (f, hex(n)))
+            newrevs, newfiles = self.addchangegroupfiles(source, revmap, trp,
+                                                         pr, needfiles)
+            revisions += newrevs
+            files += newfiles
 
             dh = 0
             if oldheads:
@@ -2432,6 +2401,47 @@ 
         else:
             return dh + 1
 
+    def addchangegroupfiles(self, source, revmap, trp, pr, needfiles):
+        revisions = 0
+        files = 0
+        while True:
+            chunkdata = source.filelogheader()
+            if not chunkdata:
+                break
+            f = chunkdata["filename"]
+            self.ui.debug("adding %s revisions\n" % f)
+            pr()
+            fl = self.file(f)
+            o = len(fl)
+            if not fl.addgroup(source, revmap, trp):
+                raise util.Abort(_("received file revlog group is empty"))
+            revisions += len(fl) - o
+            files += 1
+            if f in needfiles:
+                needs = needfiles[f]
+                for new in xrange(o, len(fl)):
+                    n = fl.node(new)
+                    if n in needs:
+                        needs.remove(n)
+                    else:
+                        raise util.Abort(
+                            _("received spurious file revlog entry"))
+                if not needs:
+                    del needfiles[f]
+        self.ui.progress(_('files'), None)
+
+        for f, needs in needfiles.iteritems():
+            fl = self.file(f)
+            for n in needs:
+                try:
+                    fl.rev(n)
+                except error.LookupError:
+                    raise util.Abort(
+                        _('missing file data for %s:%s - run hg verify') %
+                        (f, hex(n)))
+
+        return revisions, files
+
     def stream_in(self, remote, requirements):
         lock = self.lock()
         try: