Mercurial > hg
changeset 25699:5c97a4ecbdd4
convert: improve support for unusual .gitmodules
Previously convert would throw an exception if it encountered a git commit with
a .gitmodules file that was malformed (i.e. was missing, but had submodule
files, or was malformed).
Instead of breaking the convert entirely, let's print error messages and move
on.
author | Durham Goode <durham@fb.com> |
---|---|
date | Mon, 29 Jun 2015 17:19:58 -0700 |
parents | 307370c2dda2 |
children | 0fca47b206f6 |
files | hgext/convert/git.py tests/test-convert-git.t |
diffstat | 2 files changed, 47 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/convert/git.py Mon Jun 29 17:19:18 2015 -0700 +++ b/hgext/convert/git.py Mon Jun 29 17:19:58 2015 -0700 @@ -7,7 +7,7 @@ import os import subprocess -from mercurial import util, config +from mercurial import util, config, error from mercurial.node import hex, nullid from mercurial.i18n import _ @@ -185,9 +185,19 @@ def retrievegitmodules(self, version): modules, ret = self.gitread("git show %s:%s" % (version, '.gitmodules')) if ret: - raise util.Abort(_('cannot read submodules config file in %s') % - version) - self.parsegitmodules(modules) + # This can happen if a file is in the repo that has permissions + # 160000, but there is no .gitmodules file. + self.ui.warn(_("warning: cannot read submodules config file in " + "%s\n") % version) + return + + try: + self.parsegitmodules(modules) + except error.ParseError: + self.ui.warn(_("warning: unable to parse .gitmodules in %s\n") + % version) + return + for m in self.submodules: node, ret = self.gitread("git rev-parse %s:%s" % (version, m.path)) if ret:
--- a/tests/test-convert-git.t Mon Jun 29 17:19:18 2015 -0700 +++ b/tests/test-convert-git.t Mon Jun 29 17:19:58 2015 -0700 @@ -482,6 +482,39 @@ $ rm -rf hg-repo6 $ cd git-repo6 $ git reset --hard 'HEAD^' > /dev/null + +test missing .gitmodules + + $ git submodule add ../git-repo4 >/dev/null 2>/dev/null + $ git checkout HEAD .gitmodules + $ git rm .gitmodules + rm '.gitmodules' + $ git commit -m "remove .gitmodules" .gitmodules + [master *] remove .gitmodules (glob) + Author: nottest <test@example.org> + 1 file changed, 3 deletions(-) + delete mode 100644 .gitmodules + $ git commit -m "missing .gitmodules" + [master *] missing .gitmodules (glob) + Author: nottest <test@example.org> + 1 file changed, 1 insertion(+) + create mode 160000 git-repo4 + $ cd .. + $ hg convert git-repo6 hg-repo6 --traceback + fatal: Path '.gitmodules' does not exist in '*' (glob) + initializing destination hg-repo6 repository + scanning source... + sorting... + converting... + 2 addsubmodule + 1 remove .gitmodules + 0 missing .gitmodules + warning: cannot read submodules config file in * (glob) + updating bookmarks + $ rm -rf hg-repo6 + $ cd git-repo6 + $ rm -rf git-repo4 + $ git reset --hard 'HEAD^^' > /dev/null $ cd .. test invalid splicemap1