瀏覽代碼

Support GIT_AUTHOR_EMAIL / GIT_AUTHOR_NAME.

Jelmer Vernooij 6 年之前
父節點
當前提交
a65b1c79ff
共有 3 個文件被更改,包括 43 次插入9 次删除
  1. 3 0
      NEWS
  2. 13 9
      dulwich/repo.py
  3. 27 0
      dulwich/tests/test_repository.py

+ 3 - 0
NEWS

@@ -5,6 +5,9 @@
  * Use fullname from gecos field, if available.
    (Jelmer Vernooij)
 
+ * Support ``GIT_AUTHOR_NAME`` / ``GIT_AUTHOR_EMAIL``.
+   (Jelmer Vernooij)
+
  * Add support for short ids in parse_commit. (Jelmer Vernooij)
 
  * Add support for ``prune`` and ``prune_tags`` arguments

+ 13 - 9
dulwich/repo.py

@@ -135,8 +135,10 @@ def _get_default_identity():
             fullname = None
     if not fullname:
         fullname = username.encode(sys.getdefaultencoding())
-    email = ("{}@{}".format(username, socket.gethostname())
-             .encode(sys.getdefaultencoding()))
+    email = os.environ.get('EMAIL')
+    if email is None:
+        email = ("{}@{}".format(username, socket.gethostname())
+                 .encode(sys.getdefaultencoding()))
     return (fullname, email)
 
 
@@ -634,11 +636,15 @@ class BaseRepo(object):
         else:
             raise ValueError(name)
 
-    def _get_user_identity(self, config):
+    def _get_user_identity(self, config, kind=None):
         """Determine the identity to use for new commits.
         """
-        user = os.environ.get("GIT_COMMITTER_NAME")
-        email = os.environ.get("GIT_COMMITTER_EMAIL")
+        if kind:
+            user = os.environ.get("GIT_" + kind + "_NAME")
+            email = os.environ.get("GIT_" + kind + "_EMAIL")
+        else:
+            user = None
+            email = None
         if user is None:
             try:
                 user = config.get(("user", ), "name")
@@ -728,7 +734,7 @@ class BaseRepo(object):
         if merge_heads is None:
             merge_heads = self._read_heads('MERGE_HEADS')
         if committer is None:
-            committer = self._get_user_identity(config)
+            committer = self._get_user_identity(config, kind='COMMITTER')
         check_user_identity(committer)
         c.committer = committer
         if commit_timestamp is None:
@@ -740,9 +746,7 @@ class BaseRepo(object):
             commit_timezone = 0
         c.commit_timezone = commit_timezone
         if author is None:
-            # FIXME: Support GIT_AUTHOR_NAME/GIT_AUTHOR_EMAIL environment
-            # variables
-            author = committer
+            author = self._get_user_identity(config, kind='AUTHOR')
         c.author = author
         check_user_identity(author)
         if author_timestamp is None:

+ 27 - 0
dulwich/tests/test_repository.py

@@ -863,6 +863,33 @@ class BuildRepoRootTests(TestCase):
             b"Jelmer <jelmer@apache.org>",
             r[commit_sha].committer)
 
+    def overrideEnv(self, name, value):
+        def restore():
+            if oldval is not None:
+                os.environ[name] = oldval
+            else:
+                del os.environ[name]
+        oldval = os.environ.get(name)
+        os.environ[name] = value
+        self.addCleanup(restore)
+
+    def test_commit_config_identity_from_env(self):
+        # commit falls back to the users' identity if it wasn't specified
+        self.overrideEnv('GIT_COMMITTER_NAME', 'joe')
+        self.overrideEnv('GIT_COMMITTER_EMAIL', 'joe@example.com')
+        r = self._repo
+        c = r.get_config()
+        c.set((b"user", ), b"name", b"Jelmer")
+        c.set((b"user", ), b"email", b"jelmer@apache.org")
+        c.write_to_path()
+        commit_sha = r.do_commit(b'message')
+        self.assertEqual(
+            b"Jelmer <jelmer@apache.org>",
+            r[commit_sha].author)
+        self.assertEqual(
+            b"joe <joe@example.com>",
+            r[commit_sha].committer)
+
     def test_commit_fail_ref(self):
         r = self._repo