ショートカットファイルのリンク先を反対窓で開く(改2) #PPx:

ショートカットファイルのリンク先を反対窓で開く(改) #PPx - hokorobiの日記 の方法だと、どんどん新しいタブを開いていたので、表示したいパスを持っているタブがあったら、それを表示するように変更。

KC_main	= {	; PPcメイン窓
\ENTER	,%ME_jump_opposite
}

E_jump_opposite	= {	** comment **
:DIR	,*script %0script\jump_opposite.js,%*name(DCB,"%R","%1")
:LHA	,*ppc -pane:~ %*name(DCB,"%R","%1")
:PKZIP	,*ppc -pane:~ %*name(DCB,"%R","%1")
:CAB	,*ppc -pane:~ %*name(DCB,"%R","%1")
:XLF	,*ppc -pane:~ %*name(DCB,"%R","%1")
:CD	,*ppc -pane:~ %*name(DCB,"%R","%1")
7Z	,*ppc -pane:~ %*name(DCB,"%R","%1")
LNK	,*script %0script\jump_opposite.js,%*name(DCB,"%R","%1")
*	,editor %*name(DCB,"%R","%1")
}

PPx 1.30 x64, Script Module R14

#PPx BatchRename.js をいじってみた

選択ファイル名のリストを外部エディタで編集し、一気にリネームするスクリプト が動かなかったらしいので、ちょっとさわっていたら変にこねくりまわしてしまった。
オリジナルではなくて 「選択エントリーをテキストエディタで一気にリネーム」を改良したもの を元に変更している。

2ch で話題に上ったので、使う予定もないのに手を加えてみた。
UTF-8で処理するようにした。テストしてないけど。
フォルダもリネームできるようにした。
例外を使ってみたけど改悪っぽい。
そのほかちょびちょび変更。

PPx 1.30 x64, Script Module R14

nosetests で使う PEP 8 のテストを追加

2010/09/20 Pythonのコーディング規約pep8チェックをUnitTestに組み込んでみた - 清水川Web を試してみたけれど、最近の pep8 パッケージでは動かないみたいなので、 Advanced usage - pep8 1.4.6a0 documentation を見て適当に書いてみた。

test_pep8.py

# -*- coding: utf-8 -*-
from nose.tools import *
import pep8
import glob

def test_pep8():
    pep8style = pep8.StyleGuide()
    result = pep8style.check_files(glob.glob('../*.py'))
    eq_(result.total_errors, 0)

Graphviz 2.30 install

zip を展開しただけで dot.exe を実行すると、こんなエラーが出た。

(dot.exe:3928): Pango-WARNING **: `/target/lib/pango/1.6.0/modules/pango-basic-win32.dll': 指定されたモジュールが見つかりません。

msi でインストールしたら大丈夫だった。
システムの環境変数 PATH にパスが追加されたので削除した。

Mercurial の make tests を走らせてみた #mercurialjp

この記事は Mercurial Advent Calendar 2012 の 16 日目です。


Mercurial のヘルプにミスを見付けた〜とツイートしたら、開発 ML にパッチ送っちゃいなYO! 念のために make tests も動かしなさいよという声が。
ということで make tests を実行できるようにしてみる。

環境作り

Windows 上だと何かと面倒事がありそうなので、VMLinuxを動かしてそこで実行させることにする。
WindowsVirtualBox をインストールしているので、そこに Ubuntu server 12.04.1 を入れてみた。
Ubuntu は Openssh server でインストール。

まずは

$ sudo apt-get update && sudo apt-get upgrade

そして Mercurial をインストー

$ sudo apt-get install mercurial

make に必要なパッケージもインストー

$ sudo apt-get install python-dev
$ sudo apt-get install gettext
$ sudo apt-get install make
$ sudo apt-get install unzip

make tests 実行

Mercurial のソースをクローンして、先に i18n/hg.pot を作ってみようと思ったらエラーになってしまった。

$ hg clone http://selenic.com/hg
$ make update-pot

osutil が使えないらしい。

$ make local
$ make update-pot

これで動いた。
さて、目的の make tests 実行。

$ make tests
cd tests && python run-tests.py
......................................s.s....s....................sssssss.ssssss..s...ssss.sssssssss..............................................................s..............................s..........................................................................................................................s........s...........................................................................................s....s..............................
Skipped test-casecollision-merge.t: missing feature: case insensitive file system
Skipped test-casefolding.t: missing feature: case insensitive file system
Skipped test-check-pyflakes.t: missing feature: Pyflakes python linter
Skipped test-convert-baz.t: missing feature: GNU Arch baz client
Skipped test-convert-bzr-114.t: missing feature: Canonical's Bazaar client >= 1.14
Skipped test-convert-bzr-directories.t: missing feature: Canonical's Bazaar client
Skipped test-convert-bzr-ghosts.t: missing feature: Canonical's Bazaar client
Skipped test-convert-bzr-merges.t: missing feature: Canonical's Bazaar client
Skipped test-convert-bzr-treeroot.t: missing feature: Canonical's Bazaar client
Skipped test-convert-bzr.t: missing feature: Canonical's Bazaar client
Skipped test-convert-cvs-branch.t: missing feature: cvs client/server
Skipped test-convert-cvs-detectmerge.t: missing feature: cvs client/server
Skipped test-convert-cvs-synthetic.t: missing feature: cvs client/server
Skipped test-convert-cvs.t: missing feature: cvs client/server
Skipped test-convert-cvsnt-mergepoints.t: missing feature: cvs client/server
Skipped test-convert-darcs.t: missing feature: darcs client
Skipped test-convert-git.t: missing feature: git command line client
Skipped test-convert-hg-svn.t: missing feature: subversion python bindings
Skipped test-convert-mtn.t: missing feature: monotone client (>= 1.0)
Skipped test-convert-p4-filetypes.t: missing feature: Perforce server and client
Skipped test-convert-p4.t: missing feature: Perforce server and client
Skipped test-convert-svn-branches.t: missing feature: subversion python bindings
Skipped test-convert-svn-encoding.t: missing feature: subversion python bindings
Skipped test-convert-svn-move.t: missing feature: subversion python bindings
Skipped test-convert-svn-sink.t: missing feature: subversion client and admin tools >= 1.3
Skipped test-convert-svn-source.t: missing feature: subversion python bindings
Skipped test-convert-svn-startrev.t: missing feature: subversion python bindings
Skipped test-convert-svn-tags.t: missing feature: subversion python bindings
Skipped test-convert-tagsbranch-topology.t: missing feature: git command line client
Skipped test-convert-tla.t: missing feature: GNU Arch tla client
Skipped test-gendoc.t: missing feature: Docutils text processing library
Skipped test-highlight.t: missing feature: Pygments source highlighting library
Skipped test-mq-subrepo-svn.t: missing feature: subversion client and admin tools >= 1.3
Skipped test-no-symlinks.t: system supports symbolic links
Skipped test-subrepo-git.t: missing feature: git command line client
Skipped test-subrepo-svn.t: missing feature: subversion client and admin tools >= 1.5
# Ran 417 tests, 36 skipped, 0 failed.

一時間くらいかかったかな。長いなぁ。結構スキップされてしまった。
今回スキップされちゃまずそうなものもあったので、パッケージを追加して再テスト。

$ sudo apt-get install python-docutils
$ make test-gendoc.t
cd tests && python run-tests.py  test-gendoc.t
.
# Ran 1 tests, 0 skipped, 0 failed.

ソースコードの管理

ソースコードの変更は Windows でしたいので、下のような感じで Ubuntuリポジトリに対して clone, pull, push するようにしてみる。

┌───────────┐
│http://selenic.com/hg │
└───────────┘
   ↓ clone, pull
┌───────────┐
│        Ubuntu        │
└───────────┘
  ↓clone, pull   ↑push
┌───────────┐
│        Windows       │
└───────────┘

ローカルで使うだけなので、SSL も使わず、誰でも push できるようにしてしまう。
~/.hgrc に以下を追加。

[web]
push_ssl = false
allow_push = *

これで Web サーバを起動。

$ hg serve

Windows から clone, pull, push ができるようになった。
ソースコードを変更して push したら適宜 make tests を実行するということで。

パッチを投げる

パッチを投げよう - TortoiseHg Advent Calendar 2012 という記事が書かれていたので、参考にさせてもらいました。

hg now を作ったよ(バグあり)

Mercurial 界の海老蔵こと @h0k0r0bi です(……いつの間にそういうことに?)
この記事は、 @cointoss1973 さんの パッチ管理リポジトリ入門 〜MQ(パッチ)もMercurialで管理できるよ〜 - cointoss.log のバトンを受け取った Mercurial Advent Calendar 2012 の5日目です。

なにこれ

hg now というエクステンションを作りまして、こんなふうに考えて作ったよ、こんなバグがあるよというお話をします。
なんとなく動くものができたというだけの状態なので、おかしいよ! まずいよ! という突っ込み大歓迎!
元ネタは tmp コミットのための独自サブコマンド git-now - アジャイルSEを目指すブログ です。

参考

万年初心者なので、何かエクステンションを作ってみようと思うたびにお世話になっています。

方針

hg now [TEXT] の実行で、コミットメッセージに [from now] 2012-12-08 12:34:56 TEXT と diff の内容を入れてコミットできるようにします。
その他オプションはほしくなったらおいおい追加。

じゃあ作ってみよう

diff の取得

Mercurial のソースから diff を探してみます…… mercurial/commands.py で def diff を発見。

def diff(ui, repo, *pats, **opts):

実体は cmdutil.diffordiffstat を実行しているようなので、mercurial/cmdutil の diffordiffstat を見てみます。

def diffordiffstat(ui, repo, diffopts, node1, node2, match,
                   changes=None, stat=False, fp=None, prefix='',
                   listsubrepos=False):

fp にファイルを指定して cmdutil.diffordiffstat を実行すれば diff をファイルにはき出してくれるみたいです。

commit の実行

やっぱり mercurial/commands.py の commit を覗いてみます。

def commit(ui, repo, *pats, **opts):

コミットメッセージのオプションは、以下のような感じだから opts['message'] に diff の内容を入れて commands.commit(ui, repo, *pats, **opts) を実行すればいいんでしょう。

commitopts = [
    ('m', 'message', '',
     _('use text as commit message'), _('TEXT')),
    ('l', 'logfile', '',
     _('read commit message from file'), _('FILE')),
]

そんな感じで 最初の動くバージョン ができあがります。

cp932 意外の文字コードは NG

「こいつ……動くぞ!」と使っていたら案の定エラー発生。

M:\nowtest>hg now --debug
[win32mbcs] activated with encoding: cp932
nowtest_utf8N.txt
トランザクションを中断します!
ロールバックを完了しました
中断: decoding near '
+縺ゅ>縺・∴縺・
': 'cp932' codec can't decode bytes in position 224-225: illegal multibyte sequence!

UTF-8 のファイル nowtest_utf8N.txt の diff がコミットメッセージに入っているけど、cp932 ではデコードできないよと。うん、確かに。

diff の中身を cp932 に変換する

diff の文字コード変換の話をツイートしていたら yuja / hgext-textful / source / - Bitbucket でやってるよと教えていただいたので hgext/textful/encoding.py の filterencoding を 拝借

これでバッチリじゃなイカ! と思っていた時期が私にもありました。

BOM あり UTF-8 はやっぱり駄目

BOM あり UTF-8 だと同じようなエラーが出てしまいます。

M:\nowtest>hg now --debug
[win32mbcs] activated with encoding: cp932
nowtest_utf8.txt
トランザクションを中断します!
ロールバックを完了しました
中断: decoding near ' +1,1 @@
+・ソ縺ゅ>・: 'cp932' codec can't decode bytes in position 214-215: illegal multibyte sequence!

これは、バイナリの BOM もテキストとして diff 出力してしまうので、その後に文字コード変換をしてもどうしようもないよということだと思います。
なので、diff 出力時点での変換が必要なんでしょうね。
hgext-textful では、そこもうまいことやっているようですが、私にはどうしたら良いのかわかりませんでした。

まとめ

  • こんなゆるふわな感じでエクステンションは作成できます。
  • 誰かバグ取りして!!

明日は @yujauja さんの「リポジトリ変換 or hgweb」です。