Patchwork convert: add convert.git.skipsubmodules option

login
register
mail settings
Submitter Durham Goode
Date Aug. 26, 2015, 12:11 a.m.
Message ID <23af921355e9a0e05621.1440547883@dev2000.prn2.facebook.com>
Download mbox | patch
Permalink /patch/10280/
State Accepted
Headers show

Comments

Durham Goode - Aug. 26, 2015, 12:11 a.m.
# HG changeset patch
# User Durham Goode <durham@fb.com>
# Date 1440479761 25200
#      Mon Aug 24 22:16:01 2015 -0700
# Node ID 23af921355e9a0e056215c1fc9aa1914206de2a3
# Parent  05e7f57c74ac5b556b49870af86f61aa0c54babb
convert: add convert.git.skipsubmodules option

This adds an option to not pull in gitsubmodules during a convert. This is
useful when converting large git repositories where gitsubmodules were allowed
historically, but are no longer wanted.
Augie Fackler - Aug. 27, 2015, 3:17 p.m.
On Tue, Aug 25, 2015 at 05:11:23PM -0700, Durham Goode wrote:
> # HG changeset patch
> # User Durham Goode <durham@fb.com>
> # Date 1440479761 25200
> #      Mon Aug 24 22:16:01 2015 -0700
> # Node ID 23af921355e9a0e056215c1fc9aa1914206de2a3
> # Parent  05e7f57c74ac5b556b49870af86f61aa0c54babb
> convert: add convert.git.skipsubmodules option

Seems reasonable, queued, thanks.

>
> This adds an option to not pull in gitsubmodules during a convert. This is
> useful when converting large git repositories where gitsubmodules were allowed
> historically, but are no longer wanted.
>
> diff --git a/hgext/convert/__init__.py b/hgext/convert/__init__.py
> --- a/hgext/convert/__init__.py
> +++ b/hgext/convert/__init__.py
> @@ -316,6 +316,9 @@ def convert(ui, src, dest=None, revmapfi
>          ``convert.git.remoteprefix`` as a prefix followed by a /. The default
>          is 'remote'.
>
> +    :convert.git.skipsubmodules: does not convert root level .gitmodules files
> +        or files with 160000 mode indicating a submodule. Default is False.
> +
>      Perforce Source
>      ###############
>
> diff --git a/hgext/convert/git.py b/hgext/convert/git.py
> --- a/hgext/convert/git.py
> +++ b/hgext/convert/git.py
> @@ -224,6 +224,8 @@ class convert_git(converter_source):
>          lcount = len(difftree)
>          i = 0
>
> +        skipsubmodules = self.ui.configbool('convert', 'git.skipsubmodules',
> +                                            False)
>          def add(entry, f, isdest):
>              seen.add(f)
>              h = entry[3]
> @@ -232,6 +234,9 @@ class convert_git(converter_source):
>              renamesource = (not isdest and entry[4][0] == 'R')
>
>              if f == '.gitmodules':
> +                if skipsubmodules:
> +                    return
> +
>                  subexists[0] = True
>                  if entry[4] == 'D' or renamesource:
>                      subdeleted[0] = True
> @@ -239,7 +244,8 @@ class convert_git(converter_source):
>                  else:
>                      changes.append(('.hgsub', ''))
>              elif entry[1] == '160000' or entry[0] == ':160000':
> -                subexists[0] = True
> +                if not skipsubmodules:
> +                    subexists[0] = True
>              else:
>                  if renamesource:
>                      h = hex(nullid)
> diff --git a/tests/test-convert-git.t b/tests/test-convert-git.t
> --- a/tests/test-convert-git.t
> +++ b/tests/test-convert-git.t
> @@ -652,6 +652,12 @@ submodules)
>    $ hg -R git-repo6-hg tip -T "{file_dels}\n"
>    .hgsub .hgsubstate
>
> +skip submodules in the conversion
> +
> +  $ hg convert -q git-repo6 no-submodules --config convert.git.skipsubmodules=True
> +  $ hg -R no-submodules manifest --all
> +  .gitmodules-renamed
> +
>  convert using a different remote prefix
>    $ git init git-repo7
>    Initialized empty Git repository in $TESTTMP/git-repo7/.git/
> diff --git a/tests/test-convert.t b/tests/test-convert.t
> --- a/tests/test-convert.t
> +++ b/tests/test-convert.t
> @@ -265,6 +265,9 @@
>                      remote refs are converted as bookmarks with
>                      "convert.git.remoteprefix" as a prefix followed by a /. The
>                      default is 'remote'.
> +      convert.git.skipsubmodules
> +                    does not convert root level .gitmodules files or files with
> +                    160000 mode indicating a submodule. Default is False.
>
>        Perforce Source
>        ###############
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel@selenic.com
> https://selenic.com/mailman/listinfo/mercurial-devel

Patch

diff --git a/hgext/convert/__init__.py b/hgext/convert/__init__.py
--- a/hgext/convert/__init__.py
+++ b/hgext/convert/__init__.py
@@ -316,6 +316,9 @@  def convert(ui, src, dest=None, revmapfi
         ``convert.git.remoteprefix`` as a prefix followed by a /. The default
         is 'remote'.
 
+    :convert.git.skipsubmodules: does not convert root level .gitmodules files
+        or files with 160000 mode indicating a submodule. Default is False.
+
     Perforce Source
     ###############
 
diff --git a/hgext/convert/git.py b/hgext/convert/git.py
--- a/hgext/convert/git.py
+++ b/hgext/convert/git.py
@@ -224,6 +224,8 @@  class convert_git(converter_source):
         lcount = len(difftree)
         i = 0
 
+        skipsubmodules = self.ui.configbool('convert', 'git.skipsubmodules',
+                                            False)
         def add(entry, f, isdest):
             seen.add(f)
             h = entry[3]
@@ -232,6 +234,9 @@  class convert_git(converter_source):
             renamesource = (not isdest and entry[4][0] == 'R')
 
             if f == '.gitmodules':
+                if skipsubmodules:
+                    return
+
                 subexists[0] = True
                 if entry[4] == 'D' or renamesource:
                     subdeleted[0] = True
@@ -239,7 +244,8 @@  class convert_git(converter_source):
                 else:
                     changes.append(('.hgsub', ''))
             elif entry[1] == '160000' or entry[0] == ':160000':
-                subexists[0] = True
+                if not skipsubmodules:
+                    subexists[0] = True
             else:
                 if renamesource:
                     h = hex(nullid)
diff --git a/tests/test-convert-git.t b/tests/test-convert-git.t
--- a/tests/test-convert-git.t
+++ b/tests/test-convert-git.t
@@ -652,6 +652,12 @@  submodules)
   $ hg -R git-repo6-hg tip -T "{file_dels}\n"
   .hgsub .hgsubstate
 
+skip submodules in the conversion
+
+  $ hg convert -q git-repo6 no-submodules --config convert.git.skipsubmodules=True
+  $ hg -R no-submodules manifest --all
+  .gitmodules-renamed
+
 convert using a different remote prefix
   $ git init git-repo7
   Initialized empty Git repository in $TESTTMP/git-repo7/.git/
diff --git a/tests/test-convert.t b/tests/test-convert.t
--- a/tests/test-convert.t
+++ b/tests/test-convert.t
@@ -265,6 +265,9 @@ 
                     remote refs are converted as bookmarks with
                     "convert.git.remoteprefix" as a prefix followed by a /. The
                     default is 'remote'.
+      convert.git.skipsubmodules
+                    does not convert root level .gitmodules files or files with
+                    160000 mode indicating a submodule. Default is False.
   
       Perforce Source
       ###############