سؤال

أريد أن أحصل على خطاف زئبقي سيتم تشغيله قبل ارتكاب معاملة من شأنها إحباط المعاملة إذا كان الملف الثنائي الذي يتم ارتكابه أكبر من 1 ميغابايت. لقد وجدت الرمز التالي الذي يعمل بشكل جيد باستثناء مشكلة واحدة. إذا كانت التغييرات الخاصة بي تتضمن إزالة ملف ، فسوف يلقي هذا الخطاف استثناءً.

الخطاف (أنا أستخدم pretxncommit = python:checksize.newbinsize):

from mercurial import context, util
from mercurial.i18n import _
import mercurial.node as dpynode

'''hooks to forbid adding binary file over a given size

Ensure the PYTHONPATH is pointing where hg_checksize.py is and setup your
repo .hg/hgrc like this:

[hooks]
pretxncommit = python:checksize.newbinsize
pretxnchangegroup = python:checksize.newbinsize
preoutgoing = python:checksize.nopull

[limits]
maxnewbinsize = 10240
'''

def newbinsize(ui, repo, node=None, **kwargs):
    '''forbid to add binary files over a given size'''
    forbid = False
    # default limit is 10 MB
    limit = int(ui.config('limits', 'maxnewbinsize', 10000000))
    tip = context.changectx(repo, 'tip').rev()
    ctx = context.changectx(repo, node)
    for rev in range(ctx.rev(), tip+1):
        ctx = context.changectx(repo, rev)
        print ctx.files()
        for f in ctx.files():
            fctx = ctx.filectx(f)
            filecontent = fctx.data()
            # check only for new files
            if not fctx.parents():
                if len(filecontent) > limit and util.binary(filecontent):
                    msg = 'new binary file %s of %s is too large: %ld > %ld\n'
                    hname = dpynode.short(ctx.node())
                    ui.write(_(msg) % (f, hname, len(filecontent), limit))
                    forbid = True
    return forbid

الاستثناء:

$  hg commit -m 'commit message'
error: pretxncommit hook raised an exception: apps/helpers/templatetags/include_extends.py@bced6272d8f4: not found in manifest
transaction abort!
rollback completed
abort: apps/helpers/templatetags/include_extends.py@bced6272d8f4: not found in manifest!

لست على دراية بكتابة السنانير الزئبقية ، لذلك أنا في حيرة من أمري بشأن ما يجري. لماذا يهتم الخطاف بأن الملف تمت إزالته إذا كان HG يعرف بالفعل؟ هل هناك طريقة لإصلاح هذا الخطاف بحيث يعمل طوال الوقت؟

تحديث (حل):لقد قمت بتعديل الخطاف لتصفية الملفات التي تمت إزالتها في التغييرات.

def newbinsize(ui, repo, node=None, **kwargs):
    '''forbid to add binary files over a given size'''
    forbid = False
    # default limit is 10 MB
    limit = int(ui.config('limits', 'maxnewbinsize', 10000000))
    ctx = repo[node]
    for rev in xrange(ctx.rev(), len(repo)):
        ctx = context.changectx(repo, rev)

        # do not check the size of files that have been removed
        # files that have been removed do not have filecontexts
        # to test for whether a file was removed, test for the existence of a filecontext
        filecontexts = list(ctx)
        def file_was_removed(f):
            """Returns True if the file was removed"""
            if f not in filecontexts:
                return True
            else:
                return False

        for f in itertools.ifilterfalse(file_was_removed, ctx.files()):
            fctx = ctx.filectx(f)
            filecontent = fctx.data()
            # check only for new files
            if not fctx.parents():
                if len(filecontent) > limit and util.binary(filecontent):
                    msg = 'new binary file %s of %s is too large: %ld > %ld\n'
                    hname = dpynode.short(ctx.node())
                    ui.write(_(msg) % (f, hname, len(filecontent), limit))
                    forbid = True
    return forbid
هل كانت مفيدة؟

المحلول

for f in ctx.files() ستشمل الملفات التي تمت إزالتها ، تحتاج إلى تصفية تلك خارج.

(ويمكنك استبدالها for rev in range(ctx.rev(), tip+1): بواسطة for rev in xrange(ctx.rev(), len(repo)):, ، وإزالة tip = ...)

إذا كنت تستخدم زئبقًا حديثًا ، فأنت لا تفعل ذلك ctx = context.changectx(repo, node) لكن ctx = repo[node] في حين أن.

نصائح أخرى

من السهل حقًا القيام به في خطاف القشرة في الزئبق في الآونة الأخيرة:

if hg locate -r tip "set:(added() or modified()) and binary() and size('>100k')"; then
  echo "bad files!"
  exit 1
else
  exit 0
fi

ماذا يحدث هنا؟ أولاً ، لدينا مجموعة ملفات للعثور على جميع الملفات التي تم تغييرها مشكلة (انظر "Hg Help Fileselets" في HG 1.9). يشبه الأمر "تحديد موقع" الحالة ، إلا أنه يسرد الملفات ويُرجع 0 إذا وجد أي شيء. ونحن نحدد "-R نصيحة" للنظر في الالتزام المعلق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top