reflog.py 2.4 KB

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