幫新人設定 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 設定前面都有數字作為前置字元,就會自動往前排了。
在登錄編輯器設定完畢後,要記得重啟檔案總管(資源管理器 explorer.exe):
- 按下 Ctrl + Shift + Esc ,叫出工作管理員。
- 點選「詳細資料」頁籤,右鍵選擇 explorer.exe ,選擇「結束工作 」。
- 選擇左上角選單「檔案 > 執行新工作」,輸入「explorer」後按「確定」。
重啟檔案總管後,應該就可以看到 icon 更新成正常的樣子了。
打完收工。
留言列表