本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端(3)

时间:2017-05-04 02:00来源:报码现场 作者:www.wzatv.cc 点击:
很明显,我们需要两个转换函数:一个将pkt-line数据转换为一行一行的数据,另一个则是反过来,将一行一行的数据转换为pkt-line格式: 实现HTTPS请求 由于

  很明显,我们需要两个转换函数:一个将pkt-line数据转换为一行一行的数据,另一个则是反过来,将一行一行的数据转换为pkt-line格式:

  

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端

  实现HTTPS请求

  由于我只想使用标准库, 所以接下来的代码就是在不使用requests库的情况下实现身份验证HTTPS请求:

  

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端

  以上这段代码说明了requests库的存在是非常有意义的。你可以使用标准库的urllib.request模块来实现这些操作,但有时候会很痛苦。大多数Python标准库是很好用的,有一些则不是,虽然数量并不多。如果使用request的话,甚至都不需要帮助函数:

  

  我们可以使用上面的函数来向服务器询问它的主分支到哪个版本了,代码如下(这个功能还比较脆弱,但是可以很容易地修改的更为通用一点):

  

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端

  确定丢失的对象

  接下来,我们需要确定:服务器需要,但是在服务器上又不存在的对象。 pygit假定所有东西都在本地(它不支持“pulling”),所以,我写了read_tree函数(与write_tree相反),然后,用以下这两个函数在指定的树和指定的提交中递归寻找对象散列集合:

  

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端

  然后,我们需要做的就是获取本地提交引用的对象集合,用这个集合减去远程提交中引用的对象集。这两者的差异是远端丢失的对象。虽然肯定还有更加有效率的方式来生成这个对象集合,但这个逻辑对于pygit来说已经足够了:

  

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端

  推送自身

  在推送之前,我们需要发送一条pkt-line请求来说明“将主分支更新为此提交散列”,然后发送包含上述所有缺失对象的打包文件。

  打包文件有一个12个字节长的头(从PACK开始),接着是各个对象,每个对象包括长度以及用zlib算法压缩的对象数据,最后是整个打包文件的散列值,长度是20个字节。虽然,基于对象差异的算法可以让数据报文来得更小,但对我们而言就是过度设计了:

  

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端

  然后,最后一步,push()自身,为了简洁起见,我删除了一点代码:

  

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端

  命令行解析

  pygit,包括子命令(pygit init,pygit commit等),是一个使用标准库argparse模块的例子。我没有把代码复制到这里,你可以查看源代码中argparse的相关部分。

  pygit用法

  在大多数地方,我尽量让pygit命令行语法与git语法相同或接近相同。以下是将pygit提交到GitHub的命令:

  

wzatv:【j2开奖】pygit:500行Python代码实现的Git客户端

  结束语

  这些就是所有的代码逻辑了!如果你从头阅读到这里,那你仅仅只是浏览了500行Python代码,并没有任何价值。哦,等等,除了受到教育和工匠精神的价值。希望你学到了有关Git内部逻辑方面的知识。

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容