2014年1月24日金曜日

Windowsネイティブ版のMercurialをちょっといい感じに使う設定を考えてみた。

Windowsネイティブ版のMercurialをそこそこ快適に使うための設定に悩んでました。
それっぽい設定が出来た気がするので晒しておきます。


要件っぽいもの


個人的になんとなく快適に使うのに必要な要件はこれくらい。
  • カラー表示に対応
  • ページャに対応
  • hg logが文字化けしない
  • UTF-8のファイルのhg diffが文字化けしない
  • Gitっぽくrebaseとかstash(Mercurialだとshelve)もしたい
  • SSHも使える
  • TortoiseHgは使わない
  • コマンドプロンプト使う
  • 日本語ファイル名とか使わないので気にしない


必要なモジュールとか


Mercurial 2.8だとtextful extensionだけはモジュール取得しておく必要がある。
2.7以前だとshelveとかも取得しておかないといけないかもしれない。
  • color extension
  • pager extension
  • textful extension (https://bitbucket.org/yuja/hgext-textful)
  • graphlog extension
  • extdiff extension
  • mq extension
  • shelve extension
  • rebase exntesion
  • histedit extension
  • Kaoriya版Vim(UTF-8が扱える好きなエディタで良いと思う。)
  • WinMerge日本語版(外部ツールでdiff見る用。好きなもので良いと思う。)
  • msysGit(sshとlessを使う。色々試したけどlessはこれが一番良かった気がする。)


設定


環境変数HGENCODINGutf-8を設定する。
(環境変数HOMEにUSERPROFILEと同じ値を設定しておいた方が良いかもしれない。)
以下はMercurial.iniの設定例。
パスとかは適宜読み替えてください。
[ui]
username = Your Name <email@example.com>
editor = C:\tools\vim74-kaoriya-win64\vim.exe
ssh = "C:\Program Files (x86)\Git\bin\ssh.exe"

[extensions]
graphlog =
color =
mq =
rebase =
histedit =
shelve =
pager =
extdiff =
textful = C:\tools\hgext\hgext-textful\hgext\textful
textful.encoding = C:\tools\hgext\hgext-textful\hgext\textful\encoding.py
textful.msexcel = C:\tools\hgext\hgext-textful\hgext\textful\msexcel.py
textful.pipe = C:\tools\hgext\hgext-textful\hgext\textful\pipe.py

[color]
mode = ansi

[pager]
pager = "C:\Program Files (x86)\Git\bin\less.exe" -FRXr
quiet = True
attend = annotate, cat, diff, export, glog, log, qdiff, status, heads, incoming, outgoing, shelve

[extdiff]
cmd.winmerge = C:\Program Files\WinMerge\WinMergeU.exe
opts.winmerge = /r /e /x /ub

[textful]
encoding = utf-8, euc-jp, cp932, iso-2022-jp
attend = annotate, cat, diff, glog, log, qdiff, status, heads, incoming, outgoing
pipe.doc = antiword -w0 $<


まとめ的な


これくらい設定しておくと必要な要件はだいたい満たせると思う。
いまのところは特に問題なさそうな感じで使えています。
なんか間違っているところとか、もっとこうしたほうが良いとかあったら教えてください。

2014年1月23日木曜日

Mercurialでgit stashっぽいことをする方法

Mercurialでgit stashと同様の機能を使用する場合、shelve extensionを使用する。


shelve extensionの有効化


Mercurial 2.8以降であれば標準で組み込まれているので有効化する。
.hgrcまたはMercurial.iniに以下を記述する。
[extensions]
shelve =
2.7以前で使用する場合はローカルにモジュールを取得する必要がある。
$ hg clone https://bitbucket.org/astiob/hgshelv
その後、.hgrcまたはMercurial.iniに以下を記述して有効化する。
[extensions]
shelve = /path/to/hgshelve.py


使用方法


ローカルの変更を退避させておくには以下のコマンドを使用する。
$ hg shelve
逆に退避させたものを取り出すには以下のコマンドを使用する。
$ hg unshelve
退避させたものの一覧を表示するには以下のコマンドを使用する。
$ hg shelve --list
shelve/unshelveする際に名前を指定したい時は以下のように--nameオプションを使用する。
名前を指定せずにshelveした際はブックマーク名またはブランチ名が使用される。すでにそのブックマーク名なりブランチ名でshelveされている場合は連番を追加した名前なる。
$ hg shelve --name <name>
$ hg unshelve --name <name>
shelveしたものを取り出さずに削除する場合は以下を使用する。
$ hg shelve --delete <name>

2014年1月21日火曜日

Pythonで部分適用

ちょっとしたコードを書いてて、Pythonで部分適用ってどうやるんだっけ?と思いました。
パッと思いついたのは以下のようなコード。
def add(x, y)
  return x + y

add2 = lambda y: add(2, y)
print(add2(3))

なんか微妙だなと思ってちょっと調べたらfunctoolsモジュールを使えば以下のように書けることが分かった。
import functools

def add(x, y):
  return x + y

add2 = functools.partial(add, 2)
print(add2(3))

ちゃんと標準ライブラリでサポートされてましたね。

ちなみにfunctools.partial()の第一引数には呼び出し可能オブジェクトなら何でも渡せる。
lambdaでも__call__()を実装したクラスのインスタンスでもOKです。

2014年1月16日木曜日

gitのcore.autocrlfなんて滅びればいいのに。

ハマる。何度も何度も。

msysgitにせよSourceTreeにせよ、何故core.autocrlfをデフォルトでtrueに設定しようとしてくれやがるのか。

インストーラでうっかり変更し忘れて存在を忘れていたら非常に面倒なことに。

一旦cloneしてしまうと、core.autocrlfを変更しただけだと、ローカルのファイルの改行コードは変更されたままなんですよね。

そういうときはcloneし直すとかしないといけないわけですが、cloneし直さなくても以下のようなコマンドで解決出来ることがわかりました。
$ (git ls-files | xargs -rf) && git reset --hard

そもそも改行コードはある程度意図して保存してることが多いと思うんですがそうでもないんですかね? 勝手に変えて欲しくないと思うのは僕だけですかね?

つい先日もデザイナーさんのPCでVagrantで環境を作ろうとして、ProvisioningのシェルスクリプトをLFでリポジトリに入れといたのにcore.autocrlftrueになっててVagrantでProvisioningが失敗したとかそういうのでイラッとしましたね。