annotate hgext3rd/fastimport/vendor/python_fastimport/commands.py @ 86:28704a2a7461 vendor/python-fastimport

Import python-fastimport-0.9.8
author Roy Marples <roy@marples.name>
date Tue, 19 Jan 2021 22:56:34 +0000
parents
children 2fc99e3479d9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
86
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
1 # Copyright (C) 2008 Canonical Ltd
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
2 #
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
3 # This program is free software; you can redistribute it and/or modify
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
4 # it under the terms of the GNU General Public License as published by
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
5 # the Free Software Foundation; either version 2 of the License, or
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
6 # (at your option) any later version.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
7 #
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
8 # This program is distributed in the hope that it will be useful,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
11 # GNU General Public License for more details.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
12 #
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
13 # You should have received a copy of the GNU General Public License
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
15
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
16 """fast-import command classes.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
17
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
18 These objects are used by the parser to represent the content of
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
19 a fast-import stream.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
20 """
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
21 from __future__ import division
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
22
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
23 import re
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
24 import stat
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
25 import sys
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
26
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
27 from fastimport.helpers import (
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
28 newobject as object,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
29 utf8_bytes_string,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
30 repr_bytes,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
31 )
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
32
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
33
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
34 # There is a bug in git 1.5.4.3 and older by which unquoting a string consumes
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
35 # one extra character. Set this variable to True to work-around it. It only
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
36 # happens when renaming a file whose name contains spaces and/or quotes, and
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
37 # the symptom is:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
38 # % git-fast-import
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
39 # fatal: Missing space after source: R "file 1.txt" file 2.txt
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
40 # http://git.kernel.org/?p=git/git.git;a=commit;h=c8744d6a8b27115503565041566d97c21e722584
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
41 GIT_FAST_IMPORT_NEEDS_EXTRA_SPACE_AFTER_QUOTE = False
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
42
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
43
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
44 # Lists of command names
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
45 COMMAND_NAMES = [b'blob', b'checkpoint', b'commit', b'feature', b'progress',
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
46 b'reset', b'tag']
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
47 FILE_COMMAND_NAMES = [b'filemodify', b'filedelete', b'filecopy', b'filerename',
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
48 b'filedeleteall']
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
49
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
50 # Feature names
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
51 MULTIPLE_AUTHORS_FEATURE = b'multiple-authors'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
52 COMMIT_PROPERTIES_FEATURE = b'commit-properties'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
53 EMPTY_DIRS_FEATURE = b'empty-directories'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
54 FEATURE_NAMES = [
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
55 MULTIPLE_AUTHORS_FEATURE,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
56 COMMIT_PROPERTIES_FEATURE,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
57 EMPTY_DIRS_FEATURE,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
58 ]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
59
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
60
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
61 class ImportCommand(object):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
62 """Base class for import commands."""
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
63
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
64 def __init__(self, name):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
65 self.name = name
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
66 # List of field names not to display
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
67 self._binary = []
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
68
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
69 def __str__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
70 return repr(self)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
71
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
72 def __repr__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
73 if sys.version_info[0] == 2:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
74 return self.__bytes__()
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
75 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
76 return bytes(self).decode('utf8')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
77
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
78 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
79 raise NotImplementedError(
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
80 'An implementation of __bytes__ is required'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
81 )
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
82
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
83 def dump_str(self, names=None, child_lists=None, verbose=False):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
84 """Dump fields as a string.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
85
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
86 For debugging.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
87
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
88 :param names: the list of fields to include or
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
89 None for all public fields
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
90 :param child_lists: dictionary of child command names to
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
91 fields for that child command to include
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
92 :param verbose: if True, prefix each line with the command class and
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
93 display fields as a dictionary; if False, dump just the field
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
94 values with tabs between them
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
95 """
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
96 interesting = {}
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
97 if names is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
98 fields = [
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
99 k for k in list(self.__dict__.keys())
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
100 if not k.startswith(b'_')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
101 ]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
102 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
103 fields = names
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
104 for field in fields:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
105 value = self.__dict__.get(field)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
106 if field in self._binary and value is not None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
107 value = b'(...)'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
108 interesting[field] = value
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
109 if verbose:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
110 return "%s: %s" % (self.__class__.__name__, interesting)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
111 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
112 return "\t".join([repr(interesting[k]) for k in fields])
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
113
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
114
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
115 class BlobCommand(ImportCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
116
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
117 def __init__(self, mark, data, lineno=0):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
118 ImportCommand.__init__(self, b'blob')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
119 self.mark = mark
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
120 self.data = data
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
121 self.lineno = lineno
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
122 # Provide a unique id in case the mark is missing
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
123 if mark is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
124 self.id = b'@' + ("%d" % lineno).encode('utf-8')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
125 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
126 self.id = b':' + mark
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
127 self._binary = [b'data']
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
128
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
129 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
130 if self.mark is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
131 mark_line = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
132 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
133 mark_line = b"\nmark :" + self.mark
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
134 return (b'blob' + mark_line + b'\n' +
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
135 ('data %d\n' % len(self.data)).encode('utf-8') + self.data)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
136
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
137
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
138 class CheckpointCommand(ImportCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
139
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
140 def __init__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
141 ImportCommand.__init__(self, b'checkpoint')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
142
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
143 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
144 return b'checkpoint'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
145
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
146
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
147 class CommitCommand(ImportCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
148
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
149 def __init__(self, ref, mark, author, committer, message, from_,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
150 merges, file_iter, lineno=0, more_authors=None, properties=None):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
151 ImportCommand.__init__(self, b'commit')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
152 self.ref = ref
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
153 self.mark = mark
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
154 self.author = author
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
155 self.committer = committer
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
156 self.message = message
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
157 self.from_ = from_
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
158 self.merges = merges
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
159 self.file_iter = file_iter
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
160 self.more_authors = more_authors
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
161 self.properties = properties
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
162 self.lineno = lineno
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
163 self._binary = [b'file_iter']
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
164 # Provide a unique id in case the mark is missing
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
165 if self.mark is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
166 self.id = b'@' + ('%d' % lineno).encode('utf-8')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
167 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
168 if isinstance(self.mark, (int)):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
169 self.id = b':' + str(self.mark).encode('utf-8')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
170 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
171 self.id = b':' + self.mark
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
172
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
173 def copy(self, **kwargs):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
174 if not isinstance(self.file_iter, list):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
175 self.file_iter = list(self.file_iter)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
176
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
177 fields = dict(
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
178 (key, value)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
179 for key, value in self.__dict__.items()
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
180 if key not in ('id', 'name')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
181 if not key.startswith('_')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
182 )
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
183
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
184 fields.update(kwargs)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
185
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
186 return CommitCommand(**fields)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
187
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
188 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
189 return self.to_string(include_file_contents=True)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
190
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
191
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
192 def to_string(self, use_features=True, include_file_contents=False):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
193 """
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
194 @todo the name to_string is ambiguous since the method actually
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
195 returns bytes.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
196 """
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
197 if self.mark is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
198 mark_line = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
199 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
200 if isinstance(self.mark, (int)):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
201 mark_line = b'\nmark :' + str(self.mark).encode('utf-8')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
202 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
203 mark_line = b'\nmark :' + self.mark
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
204
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
205 if self.author is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
206 author_section = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
207 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
208 author_section = b'\nauthor ' + format_who_when(self.author)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
209 if use_features and self.more_authors:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
210 for author in self.more_authors:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
211 author_section += b'\nauthor ' + format_who_when(author)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
212
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
213 committer = b'committer ' + format_who_when(self.committer)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
214
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
215 if self.message is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
216 msg_section = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
217 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
218 msg = self.message
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
219 msg_section = ('\ndata %d\n' % len(msg)).encode('ascii') + msg
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
220 if self.from_ is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
221 from_line = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
222 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
223 from_line = b'\nfrom ' + self.from_
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
224 if self.merges is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
225 merge_lines = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
226 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
227 merge_lines = b''.join([b'\nmerge ' + m
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
228 for m in self.merges])
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
229 if use_features and self.properties:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
230 property_lines = []
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
231 for name in sorted(self.properties):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
232 value = self.properties[name]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
233 property_lines.append(b'\n' + format_property(name, value))
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
234 properties_section = b''.join(property_lines)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
235 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
236 properties_section = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
237 if self.file_iter is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
238 filecommands = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
239 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
240 if include_file_contents:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
241 filecommands = b''.join([b'\n' + repr_bytes(c)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
242 for c in self.iter_files()])
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
243 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
244 filecommands = b''.join([b'\n' + str(c)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
245 for c in self.iter_files()])
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
246 return b''.join([
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
247 b'commit ',
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
248 self.ref,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
249 mark_line,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
250 author_section + b'\n',
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
251 committer,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
252 msg_section,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
253 from_line,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
254 merge_lines,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
255 properties_section,
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
256 filecommands])
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
257
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
258 def dump_str(self, names=None, child_lists=None, verbose=False):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
259 result = [ImportCommand.dump_str(self, names, verbose=verbose)]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
260 for f in self.iter_files():
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
261 if child_lists is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
262 continue
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
263 try:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
264 child_names = child_lists[f.name]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
265 except KeyError:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
266 continue
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
267 result.append('\t%s' % f.dump_str(child_names, verbose=verbose))
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
268 return '\n'.join(result)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
269
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
270 def iter_files(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
271 """Iterate over files."""
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
272 # file_iter may be a callable or an iterator
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
273 if callable(self.file_iter):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
274 return self.file_iter()
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
275 return iter(self.file_iter)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
276
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
277
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
278 class FeatureCommand(ImportCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
279
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
280 def __init__(self, feature_name, value=None, lineno=0):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
281 ImportCommand.__init__(self, b'feature')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
282 self.feature_name = feature_name
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
283 self.value = value
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
284 self.lineno = lineno
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
285
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
286 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
287 if self.value is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
288 value_text = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
289 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
290 value_text = b'=' + self.value
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
291 return b'feature ' + self.feature_name + value_text
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
292
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
293
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
294 class ProgressCommand(ImportCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
295
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
296 def __init__(self, message):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
297 ImportCommand.__init__(self, b'progress')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
298 self.message = message
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
299
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
300 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
301 return b'progress ' + self.message
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
302
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
303
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
304 class ResetCommand(ImportCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
305
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
306 def __init__(self, ref, from_):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
307 ImportCommand.__init__(self, b'reset')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
308 self.ref = ref
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
309 self.from_ = from_
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
310
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
311 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
312 if self.from_ is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
313 from_line = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
314 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
315 # According to git-fast-import(1), the extra LF is optional here;
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
316 # however, versions of git up to 1.5.4.3 had a bug by which the LF
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
317 # was needed. Always emit it, since it doesn't hurt and maintains
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
318 # compatibility with older versions.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
319 # http://git.kernel.org/?p=git/git.git;a=commit;h=655e8515f279c01f525745d443f509f97cd805ab
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
320 from_line = b'\nfrom ' + self.from_ + b'\n'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
321 return b'reset ' + self.ref + from_line
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
322
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
323
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
324 class TagCommand(ImportCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
325
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
326 def __init__(self, id, from_, tagger, message):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
327 ImportCommand.__init__(self, b'tag')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
328 self.id = id
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
329 self.from_ = from_
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
330 self.tagger = tagger
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
331 self.message = message
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
332
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
333 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
334 if self.from_ is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
335 from_line = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
336 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
337 from_line = b'\nfrom ' + self.from_
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
338 if self.tagger is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
339 tagger_line = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
340 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
341 tagger_line = b'\ntagger ' + format_who_when(self.tagger)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
342 if self.message is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
343 msg_section = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
344 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
345 msg = self.message
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
346 msg_section = ('\ndata %d\n' % len(msg)).encode('ascii') + msg
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
347 return b'tag ' + self.id + from_line + tagger_line + msg_section
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
348
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
349
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
350 class FileCommand(ImportCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
351 """Base class for file commands."""
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
352 pass
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
353
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
354
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
355 class FileModifyCommand(FileCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
356
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
357 def __init__(self, path, mode, dataref, data):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
358 # Either dataref or data should be null
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
359 FileCommand.__init__(self, b'filemodify')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
360 self.path = check_path(path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
361 self.mode = mode
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
362 self.dataref = dataref
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
363 self.data = data
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
364 self._binary = [b'data']
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
365
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
366 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
367 return self.to_string(include_file_contents=True)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
368
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
369 def __str__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
370 return self.to_string(include_file_contents=False)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
371
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
372 def _format_mode(self, mode):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
373 if mode in (0o755, 0o100755):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
374 return b'755'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
375 elif mode in (0o644, 0o100644):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
376 return b'644'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
377 elif mode == 0o40000:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
378 return b'040000'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
379 elif mode == 0o120000:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
380 return b'120000'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
381 elif mode == 0o160000:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
382 return b'160000'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
383 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
384 raise AssertionError('Unknown mode %o' % mode)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
385
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
386 def to_string(self, include_file_contents=False):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
387 datastr = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
388 if stat.S_ISDIR(self.mode):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
389 dataref = b'-'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
390 elif self.dataref is None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
391 dataref = b'inline'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
392 if include_file_contents:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
393 datastr = ('\ndata %d\n' % len(self.data)).encode('ascii') + self.data
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
394 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
395 dataref = self.dataref
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
396 path = format_path(self.path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
397
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
398 return b' '.join(
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
399 [b'M', self._format_mode(self.mode), dataref, path + datastr])
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
400
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
401
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
402 class FileDeleteCommand(FileCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
403
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
404 def __init__(self, path):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
405 FileCommand.__init__(self, b'filedelete')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
406 self.path = check_path(path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
407
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
408 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
409 return b' '.join([b'D', format_path(self.path)])
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
410
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
411
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
412 class FileCopyCommand(FileCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
413
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
414 def __init__(self, src_path, dest_path):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
415 FileCommand.__init__(self, b'filecopy')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
416 self.src_path = check_path(src_path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
417 self.dest_path = check_path(dest_path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
418
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
419 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
420 return b' '.join([b'C',
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
421 format_path(self.src_path, quote_spaces=True),
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
422 format_path(self.dest_path)])
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
423
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
424
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
425 class FileRenameCommand(FileCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
426
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
427 def __init__(self, old_path, new_path):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
428 FileCommand.__init__(self, b'filerename')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
429 self.old_path = check_path(old_path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
430 self.new_path = check_path(new_path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
431
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
432 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
433 return b' '.join([
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
434 b'R',
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
435 format_path(self.old_path, quote_spaces=True),
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
436 format_path(self.new_path)]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
437 )
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
438
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
439
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
440 class FileDeleteAllCommand(FileCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
441
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
442 def __init__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
443 FileCommand.__init__(self, b'filedeleteall')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
444
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
445 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
446 return b'deleteall'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
447
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
448
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
449 class NoteModifyCommand(FileCommand):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
450
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
451 def __init__(self, from_, data):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
452 super(NoteModifyCommand, self).__init__(b'notemodify')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
453 self.from_ = from_
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
454 self.data = data
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
455 self._binary = ['data']
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
456
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
457 def __bytes__(self):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
458 return (b'N inline :' + self.from_ +
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
459 ('\ndata %d\n'% len(self.data)).encode('ascii') + self.data)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
460
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
461
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
462 def check_path(path):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
463 """Check that a path is legal.
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
464
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
465 :return: the path if all is OK
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
466 :raise ValueError: if the path is illegal
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
467 """
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
468 if path is None or path == b'' or path.startswith(b'/'):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
469 raise ValueError("illegal path '%s'" % path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
470
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
471 if (
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
472 (sys.version_info[0] >= 3 and not isinstance(path, bytes)) and
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
473 (sys.version_info[0] == 2 and not isinstance(path, str))
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
474 ):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
475 raise TypeError("illegale type for path '%r'" % path)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
476
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
477 return path
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
478
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
479
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
480 def format_path(p, quote_spaces=False):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
481 """Format a path in utf8, quoting it if necessary."""
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
482 if b'\n' in p:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
483 p = re.sub(b'\n', b'\\n', p)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
484 quote = True
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
485 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
486 quote = p[0] == b'"' or (quote_spaces and b' ' in p)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
487 if quote:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
488 extra = GIT_FAST_IMPORT_NEEDS_EXTRA_SPACE_AFTER_QUOTE and b' ' or b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
489 p = b'"' + p + b'"' + extra
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
490 return p
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
491
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
492
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
493 def format_who_when(fields):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
494 """Format a tuple of name,email,secs-since-epoch,utc-offset-secs as a string."""
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
495 offset = fields[3]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
496 if offset < 0:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
497 offset_sign = b'-'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
498 offset = abs(offset)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
499 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
500 offset_sign = b'+'
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
501 offset_hours = offset // 3600
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
502 offset_minutes = offset // 60 - offset_hours * 60
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
503 offset_str = offset_sign + ('%02d%02d' % (offset_hours, offset_minutes)).encode('ascii')
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
504 name = fields[0]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
505
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
506 if name == b'':
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
507 sep = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
508 else:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
509 sep = b' '
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
510
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
511 name = utf8_bytes_string(name)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
512
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
513 email = fields[1]
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
514
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
515 email = utf8_bytes_string(email)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
516
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
517 return b''.join((name, sep, b'<', email, b'> ', ("%d" % fields[2]).encode('ascii'), b' ', offset_str))
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
518
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
519
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
520 def format_property(name, value):
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
521 """Format the name and value (both unicode) of a property as a string."""
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
522 result = b''
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
523 utf8_name = utf8_bytes_string(name)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
524
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
525 result = b'property ' + utf8_name
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
526 if value is not None:
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
527 utf8_value = utf8_bytes_string(value)
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
528 result += b' ' + ('%d' % len(utf8_value)).encode('ascii') + b' ' + utf8_value
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
529
28704a2a7461 Import python-fastimport-0.9.8
Roy Marples <roy@marples.name>
parents:
diff changeset
530 return result