# HG changeset patch
# User Ryan McElroy <rmcelroy@fb.com>
# Date 1473069864 25200
#      Mon Sep 05 03:04:24 2016 -0700
# Node ID eb01d99111b6479abbf1a259bb323ed9ec851a8f
# Parent  c4a2ef796c1961d88487f3413e5b25d577e65525
stop dying if extras is malformed

A commit's extras field should be considered user-supplied input that can take
any form. Trusting it to be properly formatted is dangerous and can prevent
forward progress. Instead, swallow errors due to malformed extras and carry on.

diff --git a/hggit/git_handler.py b/hggit/git_handler.py
--- a/hggit/git_handler.py
+++ b/hggit/git_handler.py
@@ -464,6 +464,11 @@
             self.export_hg_commit(ctx.node(), exporter)
         self.ui.progress('exporting', None, total=total)
 
+    def set_commiter_from_author(self, commit):
+        commit.committer = commit.author
+        commit.commit_time = commit.author_time
+        commit.commit_timezone = commit.author_timezone
+
     # convert this commit into git objects
     # go through the manifest, convert all blobs/trees we don't have
     # write the commit object (with metadata info)
@@ -489,25 +494,26 @@
         commit.author_timezone = -timezone
 
         if 'committer' in extra:
-            # fixup timezone
-            (name, timestamp, timezone) = extra['committer'].rsplit(' ', 2)
-            commit.committer = name
-            commit.commit_time = timestamp
+            try:
+                # fixup timezone
+                (name, timestamp, timezone) = extra['committer'].rsplit(' ', 2)
+                commit.committer = name
+                commit.commit_time = timestamp
 
-            # work around a timezone format change
-            if int(timezone) % 60 != 0:  # pragma: no cover
-                timezone = parse_timezone(timezone)
-                # Newer versions of Dulwich return a tuple here
-                if isinstance(timezone, tuple):
-                    timezone, neg_utc = timezone
-                    commit._commit_timezone_neg_utc = neg_utc
-            else:
-                timezone = -int(timezone)
-            commit.commit_timezone = timezone
+                # work around a timezone format change
+                if int(timezone) % 60 != 0:  # pragma: no cover
+                    timezone = parse_timezone(timezone)
+                    # Newer versions of Dulwich return a tuple here
+                    if isinstance(timezone, tuple):
+                        timezone, neg_utc = timezone
+                        commit._commit_timezone_neg_utc = neg_utc
+                else:
+                    timezone = -int(timezone)
+                commit.commit_timezone = timezone
+            except: # extra is essentially user-supplied, we must be careful
+                self.set_commiter_from_author(commit)
         else:
-            commit.committer = commit.author
-            commit.commit_time = commit.author_time
-            commit.commit_timezone = commit.author_timezone
+            self.set_commiter_from_author(commit)
 
         commit.parents = []
         for parent in self.get_git_parents(ctx):