2012年9月30日星期日

Hack: 支持多个repo的cyg-apt

原本是为了在Cygwin下面安装deepgrep这个工具(见介绍 deepgrep: grep nested archives with one command ),但我发现自己编译它有点麻烦,然后又发现Cygwin Ports这个非官方仓库里面有这个strigi包。

但这个strigi包的依赖又有点多,用cygwin setup下载很有点受不了:cygwin setup缺省会下载所有的更新,虽然可以选择不管它们,但界面操作起来可有点麻烦,本来一次性麻烦一点也就罢了,但因为这个镜像很不稳定,一旦在某个包上卡死,或者发现它正在下某个我不想下载的大软件包(比如emacs24),就得重来。。。

也试用了apt-cyg-multi,但它不支持跨repo的包依赖,比如这个strigi的依赖里有几个包是在官方仓库里的,而我没有安装,它就一会儿又报告一个错误,我把缺的安装上了,再跑它,它又报告一个错误,我又得去装缺的那个。。。

算了,还是自己动手吧,看了一下apt-cyg-multi的代码,用bash写的,我觉得可读性不是太好,调试也比较麻烦,不想在这个上面改。

于是又拿起了自己简单修改过的cyg-apt,是python写的,bootstrap代价有点大,但对我而言python是必装的,也不是大问题了。

完成的代码在这里: http://code.google.com/p/bamanzi-misc/source/browse/trunk/cygwin/cyg-apt,还没有在cyg-apt原项目网站上提交patch。

支持多repo的方法是在~/.cyg-apt里面添加一个mirrors配置项,格式为python的dict格式,例如:

mirrors = { 'main': 'http://ftp.cn.debian.org/cygwin', 'ports': 'http://downloads.sourceforge.net/cygwin-ports' }

然后执行:

cyg-apt update
cyg
-apt install strigi

就等着安装完成吧。

(不过,尚不支持同一类仓库的多个mirror——如果想一个mirror连不上时,转向另一个mirror去下载,目前是不支持的。因为我觉得暂时没有太大必要,因为在~/.cyg-apt里换一个mirror就是了,至于原来下载下来的包虽说是按mirror url分目录存放的,但手工挪一下倒也不难)

另外,我改掉了cyg-apt原本每次都去自动更新setup.ini的行为,改为cyg-apt update时才更新,这跟Debian apt-get的行为一致 —— 不过cyg-apt原本的对某些子命令(比如install)会自动更新setup.ini行为并未删除,而是改到配置项auto_update(或者命令行选项'-a')上了。

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/09/08/cyg-apt-for-multi-repo.html)

deepgrep: grep nested archives with one command

Total Commander里面有个功能是我很离不开的,导致我在linux下还得用wine来跑它:可以支持搜索压缩包里面的文件内容,并且可以通过它的packer插件支持各种类型的压缩包。

先说说我最需要这个功能的一个场景吧,比如,我常常修改一些Firefox的扩展,有的扩展的安装包会在被firefox解压,但里面还有一个 content jar文件(其实是采用zip压缩格式); 而新版本的firefox对安装的扩展大都不会将xpi解压,这个xpi文件其实也是zip格式,里面很可能还会有个jar包。我有时需要搜索所有扩展的 install.rdf文件,以确定名称为xxxx的某个扩展到底在哪个文件里,有时需要搜索xpi或者jar里面的js、xul代码,以查找某个函数或 者某个页面元素的定义。

zgrep/bzgrep都只能搜索单个的gzip/bzip2压缩文件,而不能支持包含多个文件的包,不适用于上面的问题;

zipgrep性质上比较接近,支持zip文件,但有两个问题:
1. 不支持压缩包嵌套的场景(比如在上述xpi里面的content jar中间搜索js/xul的内容),
2. 它只能指定搜索某个zip文件,而不是以目录为搜索范围,然后透明地搜索多个zip文件;

前两天看见Planet Debian上有篇deepgrep: grep nested archives with one command,这个东西正式我一直以来想要的!

唯一的遗憾是deepgrep不能显示搜索结果所在的行号,这使得我想在Emacs里面集成它有点困难(本来想在grep-mode的基础上改改,可以打开搜索结果所在的文件(压缩包内的),并跳到指定的行)。

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/17/deepgrep-goes-thru-nested-archives.html)

Python脚本重定向其输出时的编码问题

python有一个比较烦的问题是,同一段程序,里面有print语句,直接运行时没有问题,一旦将其输出设了个重定向,这个脚本就不正常了,报告UnicodeEncodeError

究其原因,是Python感知到输出到控制台时,会从控制台取当前编码;而重定向后Python程序无法得知写那个文件该用哪个编码(不过为啥不用控制台的值?), 缺省就用了ascii (准确地说,是系统缺省编码sys.getdefaultencoding(),可以在sitecustomize模块里修改。而python3将缺省编码改为utf-8了) 。python - UnicodeDecodeError when redirecting to file - Stack Overflow

解决办法有两个:
 
一个是刚才提到的修改sitecustomize模块(缺省不存在,特意留给用户定制的),在里面调用sys.setdefaultcoding('xxxx')——这个函数python在import site之后就没有了,应用程序的python代码里是没法调的

方法二是shell里设置环境变量PYTHONIOENCODING,设成utf_8或者gbk都可以(只要字符集够) PrintFails - PythonInfo Wiki

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/16/python-encoding-when-redirection.html)

[git/hg] 什么叫做bare repo?

[git/hg]什么叫做bare repo?

引用一个bare repo与普通repo的区别是没有项目文件的working copy,即repo根目录下只有专用目录,而没有任何其他代码文件和文件夹;这是为了响应作为codebase应当遵循的“Only store, never update from revisions(只存储版本,不更新到实际代码文件)”原则。

hg管理的repo天生就能做codebase使用,无论是否是bare的,这点是由其分布式版本控制系统的本质决定的,它可以随时把当前的repo通过自带的http server发布代码,特别适合分布式开源项目的代码分享。

git也是分布式代码版本管理工具,不过它对作为codebase的repo做了严格的bare要求。可以看到的是许多人在初学git时不了解这一点,抱怨自己做spike时不知如何提交代码到在本机上的codebase。这里顺手写下两个tips:

* 初始建立一个bare repo

$ git init --bare

* 如果已有一个repo了,使用下面的方法将其转化为bare的

$ git config --bool core.bare true

之后可删除除了repo根目录.git文件夹之外的所有文件,即只保留专用目录


摘自: git vs hg - 挖金子的矿工 - 博客频道 - CSDN.NET

补充:
1. 上面部分说法可能不对,因为该博文是针对老版hg写的,而后来hg也有了类似git的repo内多命名分支,而对于bare repo,官方wiki (GitConcepts#Bare_repositories上)说要这样: hg update null

2. 对git而言, bare repo不仅仅是没有checkout, 而且There is no .git directory is created. Instead, the files normally in the .git directory are placed in the top-level directory where the working directory would normally be. (来自Shared Repositories Should Be Bare Repositories - GitGuys)

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/15/git-hg-bare-repo.html)

几个与Dropbox和Ubuntu One有关的链接

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/14/links-for-dropbox-ubuntu-one.html)

Create a Git Mirror (for your hg repository) / hg tip

为hg仓库建立一个git的镜像真的很简单,只需要三步:
  1. 安装hg的hg-git扩展: easy_install hg-git, 然后在~/.hgrc里面启用这个扩展;
  2. 在hg repo的hgrc里面的.hg/hgrc里添加一个path: 格式为:github = git+ssh://git@github.com/username/project.git (当然,你得先在github上创建一个空的git仓库)
  3. hg push github

注意:如果在github上的仓库不为空,hg push会被拒绝,除非你先将github上的历史pull过来。

来自:  Create a Git Mirror (for your hg repository) / hg tip

关于hg-git的更详细的说明,可查看其主页: Hg-Git Mercurial Plugin — durin42 / hg-git / overview — Bitbucket

本文链接



(automatically copied by ifttt from http://www.cnblogs.com/bamanzi/archive/2012/08/13/create-git-mirror-for-hg-repo.html)