reflog.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. """Utilities for reading and generating reflogs.
  21. """
  22. import collections
  23. from dulwich.objects import (
  24. format_timezone,
  25. parse_timezone,
  26. ZERO_SHA,
  27. )
  28. Entry = collections.namedtuple(
  29. 'Entry', ['old_sha', 'new_sha', 'committer', 'timestamp', 'timezone',
  30. 'message'])
  31. def format_reflog_line(old_sha, new_sha, committer, timestamp, timezone,
  32. message):
  33. """Generate a single reflog line.
  34. :param old_sha: Old Commit SHA
  35. :param new_sha: New Commit SHA
  36. :param committer: Committer name and e-mail
  37. :param timestamp: Timestamp
  38. :param timezone: Timezone
  39. :param message: Message
  40. """
  41. if old_sha is None:
  42. old_sha = ZERO_SHA
  43. return (old_sha + b' ' + new_sha + b' ' + committer + b' ' +
  44. str(int(timestamp)).encode('ascii') + b' ' +
  45. format_timezone(timezone) + b'\t' + message)
  46. def parse_reflog_line(line):
  47. """Parse a reflog line.
  48. :param line: Line to parse
  49. :return: Tuple of (old_sha, new_sha, committer, timestamp, timezone,
  50. message)
  51. """
  52. (begin, message) = line.split(b'\t', 1)
  53. (old_sha, new_sha, rest) = begin.split(b' ', 2)
  54. (committer, timestamp_str, timezone_str) = rest.rsplit(b' ', 2)
  55. return Entry(old_sha, new_sha, committer, int(timestamp_str),
  56. parse_timezone(timezone_str)[0], message)
  57. def read_reflog(f):
  58. """Read reflog.
  59. :param f: File-like object
  60. :returns: Iterator over Entry objects
  61. """
  62. for l in f:
  63. yield parse_reflog_line(l)