سؤال

أحاول الحصول على رقم المراجعة / معرف الزئبق (إنه تجزئة ليس عددا) برمجيا في بيثون.

السبب هو أنني أريد إضافته إلى ملفات CSS / JS على موقعنا الخاص بي مثل:

<link rel="stylesheet" href="example.css?{% mercurial_revision "example.css" %}" />

لذلك كلما تم إجراء تغيير على ورقة الأنماط، سيحصل على عنوان URL جديد ولم يعد يستخدم الإصدار المخزن مؤقتا القديم.

أو إذا كنت تعرف أين تجد وثائق جيدة للمرتكب وحدة بيثون, هذا سيكون مفيدا أيضا. لا يبدو لي أن أجدها في أي مكان.

بلدي الحل

انتهى بك المطاف باستخدام Subprocess لمجرد تشغيل أمر يحصل على عقدة HG. اخترت هذا الحل لأن API غير مضمون للبقاء كما هو الحال، ولكن واجهة bash ربما سوف:

import subprocess

def get_hg_rev(file_path):
    pipe = subprocess.Popen(
        ["hg", "log", "-l", "1", "--template", "{node}", file_path],
        stdout=subprocess.PIPE
        )
    return pipe.stdout.read()

مثال استخدام:

> path_to_file = "/home/jim/workspace/lgr/pinax/projects/lgr/site_media/base.css"
> get_hg_rev(path_to_file)
'0ed525cf38a7b7f4f1321763d964a39327db97c4'
هل كانت مفيدة؟

المحلول

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

from mercurial import ui, hg
from mercurial.node import hex

repo = hg.repository('/path/to/repo/root', ui.ui())
fctx = repo.filectx('/path/to/file', 'tip')
hexnode = hex(fctx.node())

تحديث عند مروع تغير ترتيب المعلمة، الآن هو مثل هذا:

   repo = hg.repository(ui.ui(), '/path/to/repo/root' )

نصائح أخرى

هل تعني هذه الوثائق?
لاحظ أنه، كما هو مذكور في تلك الصفحة، لا يوجد الرسمية API، لأنهم ما زالوا يحتفظون بالحق في تغييره في أي وقت. ولكن يمكنك رؤية قائمة التغييرات في الإصدارات القليلة الأخيرة، فهي ليست واسعة للغاية.

نسخة محدثة، نظافة Subprocess (الاستخدامات .check_output(), وأضاف في بيثون 2.7 / 3.1) أنني أستخدمها في ملف إعدادات Django الخاص بي للحصول على فحص النشر المنتهي في نهاية الخام (قمت بتفريغه في تعليق HTML):

import subprocess

HG_REV = subprocess.check_output(['hg', 'id', '--id']).strip()

يمكنك التفاف ذلك في try إذا كنت لا تريد بعض الفواق الغريب لمنع بدء التشغيل:

try:
    HG_REV = subprocess.check_output(['hg', 'id', '--id']).strip()
except OSError:
    HG_REV = "? (Couldn't find hg)"
except subprocess.CalledProcessError as e:
    HG_REV = "? (Error {})".format(e.returncode)
except Exception:  # don't use bare 'except', mis-catches Ctrl-C and more
    # should never have to deal with a hangup 
    HG_REV = "???"

إذا كنت تستخدم Python 2، فأنت تريد استخدامها hglib.

لا أعرف ما يجب استخدامه إذا كنت تستخدم بيثون 3، آسف. المحتمل hgapi.

محتويات هذه الإجابة

  • apis mercurial
  • كيفية استخدام HGLIB
  • لماذا HGLIB هو أفضل خيار للمستخدمين بيثون 2
  • إذا كنت تكتب خطاف، فإن أن واجهة داخلية مثبطة مريحة بفظاعة

apis mercurial

mercurial لديه اثنين من برامج أبيس الرسمية.

  1. خادم القيادة الزئانية. يمكنك التحدث معها من بيثون 2 باستخدام hglib (ويكي, pypi) الحزمة، والتي يتم الحفاظ عليها من قبل الفريق الزئبقي.
  2. واجهة سطر الأوامر في Mercurial. يمكنك التحدث معها عبر subprocess, ، أو hgapi, ، أو somesuch.

كيفية استخدام HGLIB

تثبيت:

pip install python-hglib

الاستعمال:

import hglib
client = hglib.open("/path/to/repo")

commit = client.log("tip")
print commit.author

معلومات أكثر استخداما على HGLIB Wiki Page..

لماذا HGLIB هو أفضل خيار للمستخدمين بيثون 2

لأنه يحتفظ به الفريق الزئبقي، وهذا ما يوصي الفريق الزئبي بالتفاعل مع الزئبق.

من ويكي Mercurial, ، البيان التالي حول الترابط مع Mercurial:

بالنسبة للغالبية العظمى من رمز الطرف الثالث، فإن أفضل طريقة هي استخدام API المنشورة والوثيق والمستقر: واجهة سطر الأوامر. بالتناوب، استخدم commandserver. أو المكتبات التي تستند إليها للحصول على واجهة سريعة ومستقرة ولغوية محايدة.

من صفحة خادم القيادة:

يسمح خادم Command Server] تطبيقات ومكتبات الطرف الثالث بالتواصل مع Mercurial عبر أنبوب يزيل النفقات النفقية للبدء لكل أمر. يمكن للمكتبات بعد ذلك تغليف جيل الأوامر وتحليلها لتقديم واجهة برمجة تطبيقات مناسبة للغات إلى هذه الأوامر.

واجهة بيثون إلى خادم القيادة الزئبقية، كما قال hglib.

العلامة الفرعية لكل القيادة لواجهة سطر الأوامر ليست مزحة، بالمناسبة. لقد بنيت مرة واحدة جناح اختبار صغير جدا (فقط حوالي 5 اختبارات) التي استخدمت hg عبر subprocess لإنشاء، الالتزام بالارتكاب، حفنة من Repos مع مواقف دمج. في جميع أنحاء المشروع، بقيت وقت تشغيل جناح بين 5 إلى 30 ثانية، مع كل الوقت تقريبا في hg المكالمات.

إذا كنت تكتب خطاف، فإن أن واجهة داخلية مثبطة مريحة بفظاعة

يشبه توقيع وظيفة ربط ثعبان ذلك:

# In the hgrc:
# [hooks]
# preupdate.my_hook = python:/path/to/file.py:my_hook

def my_hook(
    ui, repo, hooktype, 
    ... hook-specific args, find them in `hg help config` ..., 
    **kwargs)

ui و repo هي جزء من المذكورة المذكورة أعلاه غير رسمي API الداخلية. وبعد حقيقة أنهم هناك حقين في وظيفتك Args يجعلهم مريحة بشكل رهيب للاستخدام، كما هو الحال في هذا المثال preupdate ربط الذي لا يسمح بالدمج بين فروع معينة.

def check_if_merge_is_allowed(ui, repo, hooktype, parent1, parent2, **kwargs):
    from_ = repo[parent2].branch()
    to_ = repo[parent1].branch()
    ...
    # return True if the hook fails and the merge should not proceed.

إذا كان رمز الخطاف الخاص بك غير مهم للغاية، فلن تختاره، قد تختار استخدام API الداخلي غير الرسمي غير المحبط. إذا كان الخطاف الخاص بك جزء من امتداد أنك نشرت، استخدم أفضل hglib.

FWIW لتجنب جلب هذه القيمة على كل صفحة / عرض تجسيد، لدي فقط نشره في settings.py ملف. ثم يمكنني الرجوع settings.REVISION دون كل النفقات العامة للوصول إلى عملية Mercurial و / أو أخرى. هل لديك أي وقت مضى تغيير القيمة W / O إعادة تحميل الخادم الخاص بك؟

أردت أن أفعل نفس الشيء الذي أراد المرجع به، احصل عليه hg id -i من برنامج نصي (احصل على تنقيح نصيحة للمستودع بأكمله، وليس من ملف واحد بهذا الريبو) لكنني لم أرغب في استخدام البرمجة، والرمز من brendan حصلت لي بدأت، لكن لم أكن ما أردت.

لذلك كتبت هذا ... تعليقات / نقد مرحبا. هذا يحصل على القس الحافة في عرافة كسلسلة.

from mercurial import ui, hg, revlog
# from mercurial.node import hex  # should I have used this?

def getrepohex(reporoot):
    repo = hg.repository(ui.ui(), reporoot)
    revs = repo.revs('tip')
    if len(revs)==1:
      return str(repo.changectx(revs[0]))
    else:
      raise Exception("Internal failure in getrepohex")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top