2015-06-22 4 views
4

Я пытаюсь отладить расширение Mercurial. Это расширение добавляет код, который должен быть выполнен, когда выполняется pull. Исходный автор настраивает этот крючок, изменяя класс объекта репозитория.Перегрузка команды pull в расширении Hg

Вот соответствующий код (который на самом деле является действительным Mercurial расширение):

def reposetup(ui, repo): 
    class myrepo(repo.__class__): 
     def pull(self, remote, heads=None, force=False): 
      print "pull called" 
      return super(myrepo, self).pull(remote, heads, force) 

    print "reposetup called" 
    if repo.local(): 
     print "repo is local" 
     repo.__class__ = myrepo 

Когда я выполнить hg pull с этим расширением включен, вот выход:

# hg pull 
reposetup called 
repo is local 
pulling from ssh://hgbox/myrepo 
reposetup called 
searching for changes 
no changes found 

Это разумный способ ввести код расширения в команду pull? Почему так называемая «тянущаяся» заявка никогда не достигала?

Я использую Mercurial 3.4.1 для Windows 7 с помощью python 2.7.5.

ответ

5

Согласно кодексу (mercurial/extensions.py), это только разумный способ расширить объект хранилища (https://www.mercurial-scm.org/repo/hg/file/ff5172c83002/mercurial/extensions.py#l227).

Однако, я посмотрел на код, и объект localrepo на данный момент не имеет метода pull, поэтому я подозреваю, что поэтому ваш запрос на печать «вызывается» никогда не появляется - ничто не вызывает его, потому что оно не ожидается!

Есть более эффективные способы впрыскивания кода в pulls, в зависимости от того, что вы пытаетесь выполнить. Например, если вы просто хотите, чтобы запустить что-то каждый раз, когда выдвижной выдаются, предпочитаю вместо того, чтобы обернуть exchange.pull функции:

extensions.wrapfunction(exchange, 'pull', my_pull_function) 

Для вашего конкретного случая использования, я бы предложил создать метод со следующим код:

def expull(orig, repo, remote, *args, **kwargs): 
    transferprojrc(repo.ui, repo, remote) 
    return orig(repo, remote, *args, **kwargs) 

в методе extsetup, добавьте строку:

extensions.wrapfunction(exchange, 'pull', expull) 

Наконец, в методе reposetup, вы можете удалить класс вещи projrcrepo полностью. Надеюсь, это принесет вам поведение, которое вы ищете.

+0

Спасибо за ваш ответ. Я пытаюсь адаптировать код с помощью вашего предложения, но пока не добился успеха (я не разработчик python и иногда немного теряюсь). На самом деле я пытаюсь сделать работу расширения projrc. Я представил [вопрос] (https://bitbucket.org/aragost/projrc/issue/2/no-projrc-update-on-pull#comment-18753387), описывающий мою проблему, но поскольку я не получил обратной связи Я пытаюсь исправить это самостоятельно (с помощью SO, очевидно!). – barjak

+2

Я проверил код mercurial, и я не вижу никакого метода pull в классе localrepo, что, вероятно, является лучшим объяснением того, почему код не работает, чем мое первое предположение. Теперь я уточню свой ответ с некоторыми более конкретными идеями, которые я знаю, чего вы пытаетесь выполнить. – ryanmce

+2

Спасибо за последующее наблюдение. Я смог заставить его работать, следуя вашему предложению использовать «exchange :: pull». Я создал запрос [pull request] (https://bitbucket.org/aragost/projrc/pull-request/5/make-projrc-compatible-with-mercurial-32/diff) в проект Projrc. Не могли бы вы взглянуть на мой diff и сказать мне, если вы думаете, что все в порядке? – barjak

 Смежные вопросы

  • Нет связанных вопросов^_^