Subclassing notify
Ulrich Pfeifer
pfeifer at wait.de
Sun Apr 5 07:41:19 CDT 2009
Hello,
> The diff to the other parent can be really huge, can you check if this
> is a leak (is the memory recovered when exiting the function).
I looked at a case were one diff was 21 lines and the other about 400.
> Otherwise you could try:
> - an heuristic based on the DAG (how far are the parents from the least
> common ancestor)
> - use the size of the binary diff instead of building a "real" textual
> diff.
Both parents are not too far from each other IIRC.
Ulrich
On 04/04/2009 02:06 PM, Benoit Boissinot wrote:
> On Fri, Apr 03, 2009 at 07:17:05PM +0200, Ulrich Pfeifer wrote:
>> Hello,
>>
>> I tried to subclass notify to overwrite the part displaying a single
>> change set in the incoming hook:
>>
>> else:
>> count = 1
>> n.node(node)
>> - n.diff(node, node)
>> + n.diff_single(node)
>> data = ui.popbuffer()
>> n.send(node, count, data)
>>
>> were diff_single differs from diff by this:
>>
>> - def diff(self, node, ref):
>> + def diff_single(self, node):
>> maxdiff = int(self.ui.config('notify', 'maxdiff', 300))
>> prev = self.repo.changelog.parents(node)[0]
>>
>> - chunks = patch.diff(self.repo, prev, ref,
>> opts=patch.diffopts(self.ui))
>> + chunks = patch.diff(self.repo, prev, node,
>> opts=patch.diffopts(self.ui))
>> difflines = ''.join(chunks).splitlines()
>>
>> + if len(self.repo.changelog.parents(node))> 1:
>> + right = self.repo.changelog.parents(node)[1]
>> + chunks = patch.diff(self.repo, right, node,
>> opts=patch.diffopts(self.ui))
>> + difflines_right = ''.join(chunks).splitlines()
>> + self.ui.debug(_('\nleft=%s right=%s\nLeft %d lines, right
>> %d lines\n') % (short(prev), short(right), len(difflines),
>> len(difflines_right)))
>> + if len(difflines_right)< len(difflines):
>> + difflines = difflines_right
>> +
>> if self.ui.configbool('notify', 'diffstat', True):
>> s = patch.diffstat(difflines)
>> # s may be nil, don't include the header if it is
>> if s:
>>
>> Basically in the merge case this is emitting the shorter diff. This
>> is far from perfect - but a start of what I wanted to do.
>>
>> My problem now is, that with a fairly big repository (manifest has
>> about 65mb) the hg process bloats to above 750mb main memory.
>
> The diff to the other parent can be really huge, can you check if this
> is a leak (is the memory recovered when exiting the function).
>
> Otherwise you could try:
> - an heuristic based on the DAG (how far are the parents from the least
> common ancestor)
> - use the size of the binary diff instead of building a "real" textual
> diff.
>
> regards,
>
> Benoit
>
>
More information about the Mercurial
mailing list