# HG changeset patch # User Durham Goode # Date 1435623598 25200 # Node ID 5c97a4ecbdd49db755fde0bcc09d0dda6a6f838c # Parent 307370c2dda2bbad150d93aaf1190d12e5010b1d 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. diff -r 307370c2dda2 -r 5c97a4ecbdd4 hgext/convert/git.py --- 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: diff -r 307370c2dda2 -r 5c97a4ecbdd4 tests/test-convert-git.t --- 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 + 1 file changed, 3 deletions(-) + delete mode 100644 .gitmodules + $ git commit -m "missing .gitmodules" + [master *] missing .gitmodules (glob) + Author: nottest + 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