幫新人設定 TortoiseHg,結果要加入擴充套件 "exportfiles" 時(設定請參考:[Mercurial] 讓 TortoiseHg 能夠匯出指定版本之間的差異檔案),卻顯示錯誤訊息:

*** 匯入額外套件 exportfiles 失敗,路徑為 D:\Programs\TortoiseHg\extensions\exportfiles.py: missing attributes: norepo, optionalrepo, inferrepo
*** (use @command decorator to register 'exportfiles')
hg: 不認得'exportfiles'命令
(did you mean one of export, files?)

錯誤訊息都說了 "use @command decorator to register 'exportfiles'",上網查了這句話,參考 "Writing Mercurial Extensions" 裡的 Command table 設定方式,來調整 exportfiles.py。

原本的 cmdtable 宣告在整支程式的最後面,把它移到前面就定義好。

 

 

我是在 exportfiles.py 的第 15 行:

def exportfiles(ui, repo, outputDir, **opts):

加上了 @command 相關的段落後變成這樣:(2019/06/28 update: 更新到 TortoieHg 4.9.1 之後發現這樣不管用,調整方式寫在後面)

cmdtable = {}
command = cmdutil.command(cmdtable)
@command('exportfiles',
    [('r', 'rev', [], _('revision or revision range to export')),
    ('m', 'marker', None, _('add revision marker files to exported files')),
    ('N', 'nosub', None, _('don\'t recurse into subrepositories'))
    ], "[options] OUTPUT_DIR")
def exportfiles(ui, repo, outputDir, **opts):

並且把原本 189 行到 195 行的這些東西註解掉(Python 的多行註解是三個單引號 '''):

'''
cmdtable = {
    "exportfiles": (exportfiles, [
        ('r', 'rev', [], _('revision or revision range to export')),
        ('m', 'marker', None, _('add revision marker files to exported files')),
        ('N', 'nosub', None, _('don\'t recurse into subrepositories'))
    ], "[options] OUTPUT_DIR")
}
'''

再讓 TortoiseHg 重新編譯這個 extension 後就可以正常使用了。

 

(2019/06/28 update: 更新到 TortoiseHg 4.9.1 後的調整)

要修改的標的是 exportfiles.py 的第 15 行:

def exportfiles(ui, repo, outputDir, **opts):

因為 cmdutil 已過時而不可用,所以改為 registrar。參考 "Simple Mercurial extension fails to import",改成先在第 11 行引入 registrar:

from mercurial import util, scmutil, subrepo, registrar 

將原本的第 15 行 def eportfiles 置換為:

cmdtable = {}
command = registrar.command(cmdtable)
@command('exportfiles',
    [('r', 'rev', [], _('revision or revision range to export')),
    ('m', 'marker', None, _('add revision marker files to exported files')),
    ('N', 'nosub', None, _('don\'t recurse into subrepositories'))
    ], "[options] OUTPUT_DIR")
def exportfiles(ui, repo, outputDir, **opts):

 (最後面 189 行到 195 行的 cmdtable = { ... } 一樣要註解掉囉)

改完 py 檔後,要更新編譯 pyo 檔,我以前都是直接透過 TortoiseHg 的 GUI 介面去編輯全域設定,存檔後就會更新,但是如果有錯誤訊息,存檔後會無聲無息、毫無改變,這樣不容易發現問題。

所以這次為了 debug,我會先切到任何一個 repo 目錄下再執行 hg command:

hg --config "extensions.exportfiles=D:\Programs\TortoiseHg\extensions\exportfiles.py"

有 error 的話會在 DOS 視窗裡,照著 error message 應該可以循線找到問題。

 

此外,我沒事其實不會想更新 TortoiseHg,這次會想更新是因為我在檔案總管下,專案檔案都沒辦法顯示出新增、異動的 icon,好奇查了 "Overlay icons not showing properly" 這篇裡頭 Shea Martin 的發言,文章裡說關鍵其實是一次只能用到登錄檔 (registery) 裡定義的前 15 個  icon。

所以實際上應該要去登錄編輯程式 (regedit),找到 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ Explorer\ShellIconOverlayIdentifiers\",把在 TortoiseHg 之前的 icon 設定,變更名稱,讓它們排在 TortoiseHg 的 icon 設定之後。

文章裡的建議是說把名稱加個 "z" 當作前置字元 (prefix),或是乾脆整個刪掉。我是發現 skydrive 之類的 icon 設定我既不會用到、它們前面也只是多個空白,把空白拿掉,TortoiseHg 的 icon 設定前面都有數字作為前置字元,就會自動往前排了。

在登錄編輯器(regedit)修改機碼目錄名稱

在登錄編輯器設定完畢後,要記得重啟檔案總管(資源管理器 explorer.exe):

  1. 按下 Ctrl + Shift + Esc ,叫出工作管理員。
  2. 點選「詳細資料」頁籤,右鍵選擇 explorer.exe ,選擇「結束工作 」。
  3. 選擇左上角選單「檔案 > 執行新工作」,輸入「explorer」後按「確定」。

重啟檔案總管後,應該就可以看到 icon 更新成正常的樣子了。

恢復了Tortoise HG 的圖示 (Tortoisehg iconoverlay)

打完收工。

 

arrow
arrow

    小攻城師 發表在 痞客邦 留言(0) 人氣()