72
from binascii import hexlify
73
72
from cStringIO import StringIO
75
74
from bzrlib.atomicfile import AtomicFile
76
from bzrlib.osutils import (local_time_offset,
77
rand_bytes, compact_date,
78
kind_marker, is_inside_any, quotefn,
79
is_inside_or_parent_of_any,
80
sha_file, isdir, isfile,
75
from bzrlib.osutils import (kind_marker, is_inside_any,
76
quotefn, is_inside_or_parent_of_any,
77
sha_file, isdir, isfile, split_lines)
82
78
import bzrlib.config
83
79
import bzrlib.errors as errors
84
80
from bzrlib.errors import (BzrError, PointlessCommit,
244
240
self.local = local
245
241
self.master_branch = None
246
242
self.master_locked = False
248
243
self.specific_files = specific_files
249
244
self.allow_pointless = allow_pointless
251
if revprops is not None:
252
self.revprops.update(revprops)
254
246
if reporter is None and self.reporter is None:
255
247
self.reporter = NullCommitReporter()
276
268
# raise an exception as soon as we find a single unknown.
277
269
for unknown in self.work_tree.unknowns():
278
270
raise StrictCommitFailed()
280
if timestamp is None:
281
self.timestamp = time.time()
283
self.timestamp = long(timestamp)
285
272
if self.config is None:
286
273
self.config = bzrlib.config.BranchConfig(self.branch)
289
self.rev_id = _gen_revision_id(self.config, self.timestamp)
293
if committer is None:
294
self.committer = self.config.username()
296
assert isinstance(committer, basestring), type(committer)
297
self.committer = committer
300
self.timezone = local_time_offset()
302
self.timezone = int(timezone)
304
275
if isinstance(message, str):
305
276
message = message.decode(bzrlib.user_encoding)
306
277
assert isinstance(message, unicode), type(message)
323
294
raise NotImplementedError('selected-file commit of merges is not supported yet: files %r',
324
295
self.specific_files)
325
296
self._check_parents_present()
326
self.builder = self.branch.get_commit_builder(self.parents)
327
self.builder.set_revision_id(self.rev_id)
297
self.builder = self.branch.get_commit_builder(self.parents,
298
self.config, timestamp, timezone, committer, revprops, rev_id)
329
300
self._remove_deleted()
330
301
self._populate_new_inv()
338
309
self._emit_progress_update()
339
310
self.inv_sha1 = self.builder.finish_inventory()
340
311
self._emit_progress_update()
312
self.builder.set_message(self.message)
341
313
self._make_revision()
314
self.rev_id = self.builder._new_revision_id
342
315
# revision data is in the local branch now.
344
317
# upload revision data to the master.
503
476
def _make_revision(self):
504
477
"""Record a new revision object for this commit."""
505
rev = Revision(timestamp=self.timestamp,
506
timezone=self.timezone,
507
committer=self.committer,
508
message=self.message,
478
rev = Revision(timestamp=self.builder._timestamp,
479
timezone=self.builder._timezone,
480
committer=self.builder._committer,
481
message=self.builder.message,
509
482
inventory_sha1=self.inv_sha1,
510
revision_id=self.rev_id,
511
properties=self.revprops)
512
rev.parent_ids = self.parents
513
self.branch.repository.add_revision(self.rev_id, rev,
514
self.builder.new_inventory, self.config)
483
revision_id=self.builder._new_revision_id,
484
properties=self.builder._revprops)
485
rev.parent_ids = self.builder.parents
486
self.branch.repository.add_revision(self.builder._new_revision_id, rev,
487
self.builder.new_inventory, self.builder._config)
516
489
def _remove_deleted(self):
517
490
"""Remove deleted files from the working inventories.
549
522
revision set to their prior value.
551
524
mutter("Selecting files for commit with filter %s", self.specific_files)
552
self.new_inv = Inventory(revision_id=self.rev_id)
553
525
# iter_entries does not visit the ROOT_ID node so we need to call
554
526
# self._emit_progress_update once by hand.
555
527
self._emit_progress_update()
575
547
self.builder.record_entry_contents(ie, self.parent_invs,
576
self.rev_id, path, self.work_tree)
548
path, self.work_tree)
577
549
# describe the nature of the change that has occured relative to
578
550
# the basis inventory.
579
551
if (self.basis_inv.has_id(ie.file_id)):
598
570
if ie.file_id not in self.builder.new_inventory:
599
571
self.reporter.deleted(path)
601
def _gen_revision_id(config, when):
602
"""Return new revision-id."""
603
s = '%s-%s-' % (config.user_email(), compact_date(when))
604
s += hexlify(rand_bytes(8))