1# reflog.py -- Parsing and writing reflog files 2# Copyright (C) 2015 Jelmer Vernooij and others. 3# 4# Dulwich is dual-licensed under the Apache License, Version 2.0 and the GNU 5# General Public License as public by the Free Software Foundation; version 2.0 6# or (at your option) any later version. You can redistribute it and/or 7# modify it under the terms of either of these two licenses. 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14# 15# You should have received a copy of the licenses; if not, see 16# <http://www.gnu.org/licenses/> for a copy of the GNU General Public License 17# and <http://www.apache.org/licenses/LICENSE-2.0> for a copy of the Apache 18# License, Version 2.0. 19# 20 21"""Utilities for reading and generating reflogs. 22""" 23 24import collections 25 26from dulwich.objects import ( 27 format_timezone, 28 parse_timezone, 29 ZERO_SHA, 30 ) 31 32Entry = collections.namedtuple( 33 'Entry', ['old_sha', 'new_sha', 'committer', 'timestamp', 'timezone', 34 'message']) 35 36 37def format_reflog_line(old_sha, new_sha, committer, timestamp, timezone, 38 message): 39 """Generate a single reflog line. 40 41 :param old_sha: Old Commit SHA 42 :param new_sha: New Commit SHA 43 :param committer: Committer name and e-mail 44 :param timestamp: Timestamp 45 :param timezone: Timezone 46 :param message: Message 47 """ 48 if old_sha is None: 49 old_sha = ZERO_SHA 50 return (old_sha + b' ' + new_sha + b' ' + committer + b' ' + 51 str(int(timestamp)).encode('ascii') + b' ' + 52 format_timezone(timezone) + b'\t' + message) 53 54 55def parse_reflog_line(line): 56 """Parse a reflog line. 57 58 :param line: Line to parse 59 :return: Tuple of (old_sha, new_sha, committer, timestamp, timezone, 60 message) 61 """ 62 (begin, message) = line.split(b'\t', 1) 63 (old_sha, new_sha, rest) = begin.split(b' ', 2) 64 (committer, timestamp_str, timezone_str) = rest.rsplit(b' ', 2) 65 return Entry(old_sha, new_sha, committer, int(timestamp_str), 66 parse_timezone(timezone_str)[0], message) 67 68 69def read_reflog(f): 70 """Read reflog. 71 72 :param f: File-like object 73 :returns: Iterator over Entry objects 74 """ 75 for l in f: 76 yield parse_reflog_line(l) 77