809 |
809 |
810 |
810 |
811 def createmarkers(repo, relations, flag=0, metadata=None): |
811 def createmarkers(repo, relations, flag=0, metadata=None): |
812 """Add obsolete markers between changesets in a repo |
812 """Add obsolete markers between changesets in a repo |
813 |
813 |
814 <relations> must be an iterable of (<old>, (<new>, ...)) tuple. |
814 <relations> must be an iterable of (<old>, (<new>, ...)[,{metadata}]) |
815 `old` and `news` are changectx. |
815 tuple. `old` and `news` are changectx. metadata is an optional dictionnary |
|
816 containing metadata for this marker only. It is merged with the global |
|
817 metadata specified through the `metadata` argument of this function, |
816 |
818 |
817 Trying to obsolete a public changeset will raise an exception. |
819 Trying to obsolete a public changeset will raise an exception. |
818 |
820 |
819 Current user and date are used except if specified otherwise in the |
821 Current user and date are used except if specified otherwise in the |
820 metadata attribute. |
822 metadata attribute. |
829 metadata['date'] = '%i %i' % util.makedate() |
831 metadata['date'] = '%i %i' % util.makedate() |
830 if 'user' not in metadata: |
832 if 'user' not in metadata: |
831 metadata['user'] = repo.ui.username() |
833 metadata['user'] = repo.ui.username() |
832 tr = repo.transaction('add-obsolescence-marker') |
834 tr = repo.transaction('add-obsolescence-marker') |
833 try: |
835 try: |
834 for prec, sucs in relations: |
836 for rel in relations: |
|
837 prec = rel[0] |
|
838 sucs = rel[1] |
|
839 localmetadata = metadata.copy() |
|
840 if 2 < len(rel): |
|
841 localmetadata.update(rel[2]) |
|
842 |
835 if not prec.mutable(): |
843 if not prec.mutable(): |
836 raise util.Abort("cannot obsolete immutable changeset: %s" |
844 raise util.Abort("cannot obsolete immutable changeset: %s" |
837 % prec) |
845 % prec) |
838 nprec = prec.node() |
846 nprec = prec.node() |
839 nsucs = tuple(s.node() for s in sucs) |
847 nsucs = tuple(s.node() for s in sucs) |
840 if nprec in nsucs: |
848 if nprec in nsucs: |
841 raise util.Abort("changeset %s cannot obsolete itself" % prec) |
849 raise util.Abort("changeset %s cannot obsolete itself" % prec) |
842 repo.obsstore.create(tr, nprec, nsucs, flag, metadata) |
850 repo.obsstore.create(tr, nprec, nsucs, flag, localmetadata) |
843 repo.filteredrevcache.clear() |
851 repo.filteredrevcache.clear() |
844 tr.close() |
852 tr.close() |
845 finally: |
853 finally: |
846 tr.release() |
854 tr.release() |