From d5dfab1f4dfd7ac111f27a216dafb1f007e9f24b Mon Sep 17 00:00:00 2001 From: Jiang Xin Date: Thu, 1 Nov 2018 09:04:00 +0800 Subject: [PATCH 1/4] Join alibaba Signed-off-by: Jiang Xin --- about.md | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/about.md b/about.md index 894adeb..1c5b57e 100644 --- a/about.md +++ b/about.md @@ -9,7 +9,8 @@ layout: master 2010年我认准Git在版本控制领域已无可阻挡,于是把公司业务暂搁一旁,去完成我在2003年便开始的一个梦想 —— 要在书架上摆上一本自己的书。花了很长时间给书起名,我想出来的最酷的名字就是:GotGit。很遗憾出版社认为这个名字缺乏卖点,但我还是可以通过URL来纪念这个名字: [https://github.com/gotgit/gotgit/](https://github.com/gotgit/gotgit/) 是本书官网版本库,托管在 GitHub 上。 -2015年12月加入[华为技术有限公司](http://www.huawei.com)。 +- 2018年10月加入[阿里巴巴](http://www.alibaba.com)。 +- 2015年12月加入[华为](http://www.huawei.com)。 -- 蒋鑫 @@ -17,23 +18,12 @@ layout: master 声明:2015年12月起,公司业务暂停。原有客户的技术支持已全权委托 [北京共致开源信息科技有限公司](http://www.embracesource.com)。 -北京群英汇信息技术有限公司,一个专注于开源软件推广的咨询公司。网址: [http://www.ossxp.com/](http://www.ossxp.com) 。 +北京群英汇信息技术有限公司,一个专注于开源软件推广的咨询公司。 -[群英汇](http://www.ossxp.com/) 于 2005 年创建,一个我的开源软件试验场,你可以说他的雇员少得可怜,但我更倾向于向客户说公司有着所有全世界其他商业机构都不具备的庞大的开发团队,因为他集成了众多开源产品。 +[群英汇](http://www.ossxp.com/) 于 2005 年创建,一个我的开源软件试验场,一个以“汇聚全球智慧,为客户创建价值”为理念,集开源项目成功经验之大成,为企业的研发管理助力。 群英汇的商业模式是通过对开源软件进行定制和优化实现增值,提供给客户培训、软件安装部署,以及技术支持等服务。有人诟病公司不够开源,但我们的确把源代码提供给我们服务的客户,客户不是为软件付费,而是我们提供的服务。我真的希望有一天当公司有了更加稳健的财务收入,清晰的商业路线,以及更多的资源后,能够有更多的精力重新回归到如何贡献开源社区上。 -下面是中国IT行业创业所需要的最小团队配置,权当为有创业激情的年轻人泼点冷水: - -* 一个网管。 - 网站托管在国内还是国外这是一个问题。国内托管垄断价高、国际互联网众所周知的和谐、就连DNS由谁解析也是十分严肃的问题。还要应对各种换着花样的网站备案、网络审核,所以招个专职网管吧。 - -* 一个会计或出纳。 - 会计可以外包,但其他一些国税、地税、工商、银行的琐事,如:每月的报税和更新税控卡、更换税控器、更换财务章、更换发票、新政策培训、申请发票额度调整、开具发票、公司年审等,没个专人真还不行。 - -* 一个体制内的达人。 - 体制内达人能让公司获得不受封锁的网络接入,否则很多技术网站你是上不去的,谷歌也基本无法使用。 - ## 关于 WorldHello.net 网址 WorldHello.net 是我自2002年开始维护的个人网站,2002-2006 年陆续用 [DocBook](/doc/docbook_howto/) 及 [FreeMind](/doc/freemind/freemind.mm.htm) 撰写了一些技术文章, 并在 2006 年将这些历史文章重新整理,尝试建立一个名为 [WHODO](/doc/whodo_howto/) 的项目,以期像 [The Linux Documentation Project](http://tldp.org/) 一样建立一种易于维护的开放文档平台... From e632f6cd315fea2cfc78f051557b4e4584d77a18 Mon Sep 17 00:00:00 2001 From: Jiang Xin Date: Thu, 1 Nov 2018 14:01:52 +0800 Subject: [PATCH 2/4] To suppress github build warning, change highlighter to rouge Signed-off-by: Jiang Xin --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 6d67c09..bb8ca6d 100644 --- a/_config.yml +++ b/_config.yml @@ -1,2 +1,2 @@ markdown: rdiscount -pygments: true +highlighter: rouge From 42e5d356b67a242dacc4c861797b217d9f0ddf97 Mon Sep 17 00:00:00 2001 From: Jiang Xin Date: Sun, 17 Mar 2019 19:24:54 +0800 Subject: [PATCH 3/4] git config read/write using goconfig Signed-off-by: Jiang Xin --- _posts/2019-03-17-goconfig.md | 76 +++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 _posts/2019-03-17-goconfig.md diff --git a/_posts/2019-03-17-goconfig.md b/_posts/2019-03-17-goconfig.md new file mode 100644 index 0000000..8cc9a4b --- /dev/null +++ b/_posts/2019-03-17-goconfig.md @@ -0,0 +1,76 @@ +--- +layout: post +title: "Go 语言解析 git config" +--- + +最近做的一个 go 语言的项目需要频繁读写 git config 文件,一些看似现成的解决方案并不能满足需要: + +1. 不考虑调用外部命令 `git config`,因为在 Windows 平台性能差。 +2. 不考虑 `libgit2`,因为会给静态编译和发布带来麻烦。 + +在 github 上找到一个能够解析 git config 文件的项目 [goconfig](https://github.com/muja/goconfig),该项目的代码直接从 Git 项目的 +[git/config.c](https://github.com/git/git/blob/95ec6b1b3393eb6e26da40c565520a8db9796e9f/config.c) 移植过来,可以确保兼容性。但是这个项目只是一个半成品,因为: + +1. 不支持多值配置项。Git 的很多设置实际上是多值配置项,例如:`push.pushOption`、`remote..fetch` 等。 +2. 不支持配置文件嵌套,即不支持通过 `include.path` 指令包含其他配置文件,而这在我们要开发的应用中至关重要。 +3. 不支持配置文件继承(多级配置)。Git 在读取一个配置项时,会依次读取系统级配置(`/etc/gitconfig`)、用户全局配置(`$HOME/.gitconfig`)、仓库级配置文件(`.git/config`)、嵌套的配置文件(`include.path` 指向的配置文件)。从优先级上看,仓库级配置文件高于全局配置,更高于系统级配置。 +4. 不支持写配置文件。 + +于是派生了一个项目到 [jiangxin/goconfig](https://github.com/jiangxin/goconfig),实现了上述特性。 + +## 增加多值配置特性 + +实际上 Git 配置项,无论单值(如 `user.name`),还是多值(如 `remote..fetch`),都应该一视同仁当做多值来处理,这样配置文件嵌套、配置文件继承的处理就非常简单了。即: + +1. 每一个配置项(如 `user.name`)的值是一个字符串数组。 +2. 如果用户将某个配置项视为单值设置,只取数组的最后一项,作为该配置的唯一值。 +3. 如果用户将某个配置项视为多值设置,数组所有内容都是该配置项内容。 + +为此将 `goconfig.go` 的返回值由 `map[string]string` 替换为支持多值配置的自定义类型 + + type GitConfig map[string]GitConfigKeys + type GitConfigKeys map[string][]string + +其中 GitConfig 的索引对应 config 配置文件的小节(section)名称,GitConfigKeys 的索引对应于配置项在小节内的 key。 + +GitConfig 最核心的方法是 `GetAll`,其他方法 `Get`, `GetBool`, `GetInt` 等都是基于 `GetAll` 方法。 + +参见提交 [9e83c31 (Add GitConfig to read boolean, int, multi-values, 2019-02-28)](https://github.com/jiangxin/goconfig/commit/9e83c3157189a458a63832c151fbd52222ddd56a)。 + +## 增加配置文件嵌套特性 + +配置文件嵌套,涉及到迭代和配置文件的合并。核心方法是 GitConfig 的 `Merge` 方法。 + +参见提交 [83a00ae (Parse include config files from include.path, 2019-03-05)](https://github.com/jiangxin/goconfig/commit/83a00ae5b8090415985162b6e3381de03532a573) 。 + +## 增加配置文件继承 + +配置文件继承和配置文件嵌套非常相似,都是 GitConfig 结构体的 Merge,只不过多了一些文件 IO,以及缓存机制。 + +参见提交 [a033f72 (Add Load() function to read git config from disk, 2019-03-04)](https://github.com/jiangxin/goconfig/commit/a033f72a584b0c66a285cb29c50028ce3bbfba11) + +## 增加配置文件写操作 + +实际上第一个版本的 GitConfig 结构体定义为 `map[string][]string`,就可以实现多值配置。为了支持将 GitConfig 结构体回写为文件,对其做了提交修补(git commit --amend)操作。 +GitConfig 的 map 索引变成了小节(section)名称。 + +为了支持写操作所做的第二个改变是为每一个值增加了一个范围(scope),这样在保存 GitConfig 到文件的时候,知道哪些配置来自于系统级(ScopeSystem)、全局级(ScopeGlobal)、 +文件嵌套(ScopeGlobal),只将配置文件中的 ScopeSelf 记录到配置文件中。 + +参见提交: + +* [784eaa8 (Mark values with scope, such as system, global, self, 2019-03-09)](https://github.com/jiangxin/goconfig/commit/784eaa8d6f2f0822d41cb7ff3e4ed8c5bd1d7820) +* [feb3e92 (String() of GitConfig is ready for saving file, 2019-03-11)](https://github.com/jiangxin/goconfig/commit/feb3e92f752625e07e3627d5a951fc500cbba0bf) +* [b826f49 (Save GitConfig to file using Save(), 2019-03-11)](https://github.com/jiangxin/goconfig/commit/b826f4926857921ac0851ae98926ddb82dd7dbcc) + +## 一个简单的 git-config 实现 + +作为一个 lib,goconfig 项目的根目录是名为 `goconfig` 的包,为了演示如何用 `goconfig` 实现一个完整的 `git config` 命令的功能,在 `cmd/gocongig` 目录下写了一个 `main` 包。 + +可以用如下命令编译安装这一 `goconfig` 示例: + + go get github.com/jiangxin/goconfig/cmd/goconfig + +示例代码参见:[cmd/goconfig/main.go](https://github.com/jiangxin/goconfig/blob/master/cmd/goconfig/main.go)。 + +欢迎使用 goconfig 并帮助改进 From eb3e3882e1f94d58ecdb432e2b65619bd5f1224a Mon Sep 17 00:00:00 2001 From: Jiang Xin Date: Thu, 31 Oct 2019 09:19:24 +0800 Subject: [PATCH 4/4] fixup! Join alibaba Signed-off-by: Jiang Xin --- about.md | 1 - 1 file changed, 1 deletion(-) diff --git a/about.md b/about.md index 1c5b57e..a8b6ec2 100644 --- a/about.md +++ b/about.md @@ -10,7 +10,6 @@ layout: master 2010年我认准Git在版本控制领域已无可阻挡,于是把公司业务暂搁一旁,去完成我在2003年便开始的一个梦想 —— 要在书架上摆上一本自己的书。花了很长时间给书起名,我想出来的最酷的名字就是:GotGit。很遗憾出版社认为这个名字缺乏卖点,但我还是可以通过URL来纪念这个名字: [https://github.com/gotgit/gotgit/](https://github.com/gotgit/gotgit/) 是本书官网版本库,托管在 GitHub 上。 - 2018年10月加入[阿里巴巴](http://www.alibaba.com)。 -- 2015年12月加入[华为](http://www.huawei.com)。 -- 蒋鑫