summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlba Mendez <me@alba.sh>2020-08-31 10:43:24 +0200
committerSebastian Thiel <sebastian.thiel@icloud.com>2020-08-31 19:19:17 +0800
commit4a1991773b79c50d4828091f58d2e5b0077ade96 (patch)
treeebbec4050808d430e1b5e5c0f536d35ccea265ea
parent6ef37754527948af1338f8e4a408bda7034d004f (diff)
downloadgitpython-4a1991773b79c50d4828091f58d2e5b0077ade96.tar.gz
accept datetime instances as dates
There's no easy way to re-create a commit (i.e. for rewriting purposes), because dates must be formatted as strings, passed, then parsed back. This patch allows parse_date() to accept datetime instances, such as those produced by from_timestamp() above.
-rw-r--r--git/objects/util.py5
-rw-r--r--test/test_util.py5
2 files changed, 10 insertions, 0 deletions
diff --git a/git/objects/util.py b/git/objects/util.py
index b02479b7..d15d83c3 100644
--- a/git/objects/util.py
+++ b/git/objects/util.py
@@ -135,6 +135,7 @@ def parse_date(string_date):
"""
Parse the given date as one of the following
+ * aware datetime instance
* Git internal format: timestamp offset
* RFC 2822: Thu, 07 Apr 2005 22:13:13 +0200.
* ISO 8601 2005-04-07T22:13:13
@@ -144,6 +145,10 @@ def parse_date(string_date):
:raise ValueError: If the format could not be understood
:note: Date can also be YYYY.MM.DD, MM/DD/YYYY and DD.MM.YYYY.
"""
+ if isinstance(string_date, datetime) and string_date.tzinfo:
+ offset = -int(string_date.utcoffset().total_seconds())
+ return int(string_date.astimezone(utc).timestamp()), offset
+
# git time
try:
if string_date.count(' ') == 1 and string_date.rfind(':') == -1:
diff --git a/test/test_util.py b/test/test_util.py
index 26695df5..df4e5474 100644
--- a/test/test_util.py
+++ b/test/test_util.py
@@ -174,6 +174,10 @@ class TestUtils(TestBase):
self.assertIn('@', get_user_id())
def test_parse_date(self):
+ # parse_date(from_timestamp()) must return the tuple unchanged
+ for timestamp, offset in (1522827734, -7200), (1522827734, 0), (1522827734, +3600):
+ self.assertEqual(parse_date(from_timestamp(timestamp, offset)), (timestamp, offset))
+
# test all supported formats
def assert_rval(rval, veri_time, offset=0):
self.assertEqual(len(rval), 2)
@@ -200,6 +204,7 @@ class TestUtils(TestBase):
# END for each date type
# and failure
+ self.assertRaises(ValueError, parse_date, datetime.now()) # non-aware datetime
self.assertRaises(ValueError, parse_date, 'invalid format')
self.assertRaises(ValueError, parse_date, '123456789 -02000')
self.assertRaises(ValueError, parse_date, ' 123456789 -0200')