18652Snate@binkert.orgfrom mercurial import context
28652Snate@binkert.orgfrom mercurial.i18n import _
38652Snate@binkert.org
48652Snate@binkert.org'''
58652Snate@binkert.org[extensions]
68652Snate@binkert.orghgfilesize=~/m5/incoming/util/hgfilesize.py
78652Snate@binkert.org
88652Snate@binkert.org[hooks]
98652Snate@binkert.orgpretxncommit = python:hgfilesize.limit_file_size
108652Snate@binkert.orgpretxnchangegroup = python:hgfilesize.limit_file_size
118652Snate@binkert.org
128652Snate@binkert.org[limit_file_size]
138652Snate@binkert.orgmaximum_file_size = 200000
148652Snate@binkert.org'''
158652Snate@binkert.org
168652Snate@binkert.orgdef limit_file_size(ui, repo, node=None, **kwargs):
178652Snate@binkert.org    '''forbid files over a given size'''
188652Snate@binkert.org
198652Snate@binkert.org    # default limit is 1 MB
208652Snate@binkert.org    limit = int(ui.config('limit_file_size', 'maximum_file_size', 1024*1024))
218652Snate@binkert.org    existing_tip = context.changectx(repo, node).rev()
228652Snate@binkert.org    new_tip = context.changectx(repo, 'tip').rev()
238652Snate@binkert.org    for rev in xrange(existing_tip, new_tip + 1):
248652Snate@binkert.org        ctx = context.changectx(repo, rev)
258652Snate@binkert.org        for f in ctx.files():
268680Snate@binkert.org            if f not in ctx:
278680Snate@binkert.org                continue
288652Snate@binkert.org            fctx = ctx.filectx(f)
298652Snate@binkert.org            if fctx.size() > limit:
308652Snate@binkert.org                ui.write(_('file %s of %s is too large: %d > %d\n') % \
318652Snate@binkert.org                             (f, ctx, fctx.size(), limit))
328652Snate@binkert.org                return True # This is invalid
338652Snate@binkert.org
348652Snate@binkert.org    return False # Things are OK.
35