Linux kernel官网cgit工具不支持按变更代码进行补丁搜索,想到个办法就是把补丁都抓下来,这样可以在本地搜索。花了2个小时写了个小工具,话不多说,直接看效果:

E:\docs\TOOLS\python\patch_spider>python patch_spider.py linux-3.10.y fs/ubifs 2013-08-15:
get patches info...
2016-08-27 eed1a4028c96cabb79747ee01e17b1057b01027c UBIFS: Implement ->migratepage()
2014-11-14 6f1aec53eded9399e6b44cab8c9aa36c65a8f402 UBIFS: fix free log space calculation
2014-11-14 918ecf66a11bb3bdc818a264319dcaf984c11a3f UBIFS: fix a race condition
2014-11-14 c4e70e76860cc84cebd719fbd89637fdd226cf94 UBIFS: remove mst_mutex
2014-07-07 6f02490b96062bdd8a7914e1287a70c5a01d6a3d UBIFS: Remove incorrect assertion in shrink_tnc()
2014-07-07 ac8df9ec7b4e25b87d5a71dfd9af4d8076d66bff UBIFS: fix an mmap and fsync race condition
saving patches into...
[1/6] save fs_ubifs\UBIFS__Implement___gt_migratepage__.patch
[2/6] save fs_ubifs\UBIFS__fix_free_log_space_calculation.patch
[3/6] save fs_ubifs\UBIFS__fix_a_race_condition.patch
[4/6] save fs_ubifs\UBIFS__remove_mst_mutex.patch
[5/6] save fs_ubifs\UBIFS__Remove_incorrect_assertion_in_shrink_tnc__.patch
[6/6] save fs_ubifs\UBIFS__fix_an_mmap_and_fsync_race_condition.patch
done

源码

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. ######################################################################
  4. # Purpose: auto download kernel module patch from offical web
  5. # Useage: ./patch_spider.py
  6. # example: patch_spider.py linux-3.10.y fs/ubifs 2013-08-15:2016-11-11
  7. # Version: Initial Version by Alex
  8. ######################################################################
  9.  
  10. import httplib, urllib, urllib2
  11. import sys, os
  12. import datetime
  13. import re
  14.  
  15. DEBUG = 0
  16. if DEBUG: from pprint import *
  17.  
  18. class PatchSpider(object):
  19. def __init__(self):
  20. pass
  21.  
  22. def run(self):
  23. # main function
  24. print 'get patches info...'
  25. patch_ids = self.get_patch_id()
  26. print 'saving patches into...'
  27. ret = self.save_patch_file(patch_ids)
  28. print 'done'
  29.  
  30. return 0
  31.  
  32. def get_patch_id(self):
  33. # get online data
  34. response_data = []
  35. urlstr = "http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/log/%s?h=%s&ofs=%d"
  36. dt_format = '%Y-%m-%d'
  37.  
  38. start, end = args['date-range'].split(':')
  39. if not start.strip(): start = datetime.datetime.now().strftime(dt_format)
  40. if not end.strip(): end = datetime.datetime.now().strftime(dt_format)
  41. dt_start = datetime.datetime.strptime(start, dt_format)
  42. dt_end = datetime.datetime.strptime(end, dt_format)
  43.  
  44. for ofs in range(0, 10000, 50):
  45. url = urlstr % (args['module'], args['version'], ofs)
  46. req = urllib2.Request(url)
  47.  
  48. try:
  49. response = urllib2.urlopen(req).read()
  50.  
  51. for item in self.extract_from(response):
  52. date, id, msg = item
  53. dt_date = datetime.datetime.strptime(date, dt_format)
  54. if dt_start <= dt_date <= dt_end:
  55. print date, id, msg
  56. response_data.append(item)
  57. else:
  58. return response_data
  59.  
  60. except urllib2.HTTPError, e:
  61. print('HTTPError = ' + str(e.code))
  62. except urllib2.URLError, e:
  63. print('URLError = ' + str(e.reason))
  64. except httplib.HTTPException, e:
  65. print('HTTPException')
  66. except Exception:
  67. raise
  68.  
  69. return response_data
  70.  
  71. def save_patch_file(self, l):
  72. format = 'http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/patch/%s?id=%s'
  73. folder = self.assemble_path(args['module'])
  74.  
  75. if os.path.exists(folder):
  76. print '%s existed, please backup your data!' %folder
  77. return -1
  78. else:
  79. os.makedirs(folder)
  80.  
  81. log = ["%s %s %s\n" %(i[0],i[1],i[2]) for i in l]
  82. open(os.path.join(folder, 'patches.log'), 'w').writelines(log)
  83.  
  84. total = len(l)
  85. for index, item in enumerate(l):
  86.  
  87. _,id,msg = item
  88. patch = format % (args['module'], id)
  89. file = os.path.join(folder, self.assemble_path(msg) + '.patch')
  90.  
  91. urllib.urlretrieve(patch, file)
  92. print "[%d/%d] save %s" %(index+1, total, file)
  93.  
  94. def extract_from(self, html):
  95. res = r"""<tr><td>.*?
  96. <span\ title.*?>(?P<date>\d+-\d+-\d+)</span>.*?
  97. <a\ href.*?id=(?P<id>\w+)'>(?P<msg>.*?)</a>.*?
  98. </td></tr>"""
  99. rec = re.compile(res, re.DOTALL|re.VERBOSE)
  100. return re.findall(rec,html)
  101.  
  102. def assemble_path(self, msg):
  103. path = ''
  104. for c in msg:
  105. path += c if c.isalnum() else '_'
  106.  
  107. return path
  108.  
  109. # default args
  110. args = {
  111. "version": "linux-3.10.y",
  112. "module": "fs/ubifs",
  113. "date-range": "2013-08-15:",
  114. }
  115.  
  116. if len(sys.argv) > 1:
  117. args['version'] = sys.argv[1]
  118. if len(sys.argv) > 2:
  119. args['module'] = sys.argv[2]
  120. if len(sys.argv) > 3:
  121. args['date-range'] = sys.argv[3]
  122.  
  123. ret = PatchSpider().run()
  124. sys.exit(ret)

Linux内核补丁批量自动下载工具的更多相关文章

  1. Linux内核调试的方式以及工具集锦【转】

    转自:https://blog.csdn.net/gatieme/article/details/68948080 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  2. Linux内核调试的方式以及工具集锦

    原文:https://blog.csdn.net/gatieme/article/details/68948080 CSDN GitHubLinux内核调试的方式以及工具集锦 LDD-LinuxDev ...

  3. linux下常用网页查看下载工具--wget

    http://www.linuxidc.com/Linux/2015-06/118256.htm 5 个基于Linux命令行的文件下载和网站浏览工具 rTorrent.wget.cURL.w3m.El ...

  4. Linux内核补丁升级

    如果机器已经联网,直接利用包管理工具更新,需要注意的是现在3.0以上的内核引入了签名机制,需要导入签名的key,参考步骤如下: 1.导入keyrpm --import https://www.elre ...

  5. Linux部署之批量自动安装系统之TFTP篇

    1.         安装:yum install tftp-server –y   2.         配置tftp文件开启tftp功能   3.         开启依赖服务xinetd   4 ...

  6. linux内核开源代码地址下载

    https://www.kernel.org/pub/linux/kernel/v2.6/

  7. Linux部署之批量自动安装系统之测试篇

    1.         客户端从网络启动如下   2.         复制vesamenu.c32文件可解决上面的问题   3.         客户端再次启动   4.         选择第一个进 ...

  8. Linux部署之批量自动安装系统之Kickstart篇

    1.         安装   2.         在桌面环境下啊配置   3.         Kickstart之基本配置   4.         Kickstart之安装方法   5.    ...

  9. Linux部署之批量自动安装系统之NFS篇

    1.         编辑配置文件让远端设备可访问vim /etc/exports   2.         启动服务

随机推荐

  1. frp配置

    frps配置 --------------------------------------------------------------------------------------------- ...

  2. 答辩HTML5

    答辩有三个项目,有三个游戏和知乎,游戏都是有js写的,我想说的是想要做一个是那么难啊!老师给了我们游戏的项目还有游戏的思路构成,完成项目.还有一个知乎,也很难,用到HTML,css3,php,数据库, ...

  3. linux(centOS)下安装Oracle步骤

    ##创建用户和组: [LanRS@localhost ~]$ su root #切换到root Password: [root@localhost LanRS]# groupadd oinstall ...

  4. RIDE小技巧——Content Assistance快捷键(CTRL+空格)的修改

    大家在用RIDE Content Assistance功能的快捷键时会与机器中是输入法的切换相冲突,这里提供一下修改的位置,大家可以根据个人的喜好修改. 有三处需要修改: {Python_home}\ ...

  5. iOS 编译时的警告导致无法通过编译

    今天编译react native的代码,发现了2个警告,但是系统却当做错误,不能编译成功,查看了一下编译选项,看到了如下配置: 注意到这个-Werror 了吗? 就是这个标志导致系统把所有的 警告都当 ...

  6. int ,long , long long类型的范围

    int ,long , long long类型的范围 unsigned - - unsigned - - unsigned __int64的最大值: __int64的最小值:- unsigned __ ...

  7. svn上传工程之后下载,打开下载之后的工程缺少文件

    当我们把iOS的工程上传到SVN中,当我们再从SVN中下载下来,就会出现错误,这是什么原因呢?我这里出现的错误是找不到文件,后来知道原来是被屏蔽掉了,就是上传的时候不上传某个类型的文件.例如我出错就是 ...

  8. For Freedom —— 代理篇

    人生在世,总是受到各种约束.心脏跳动都感到困难呢!! 公司内网,安全区,fq等等等~~我们需要一个稳定易用高性能高弹性的代理工具!3Proxy,Here it is, CLICK ME!! 简单介绍下 ...

  9. 复制远程共享文件夹内容到本地(python脚本实例)

    本人自用脚本(python): #-*- coding:utf-8 -*- import sys , os , re def copyFileDir(srcFilename , desFilename ...

  10. 【React】组件生命周期

    初始化阶段 getDefaultPropos:只调用一次,实力之间共享引用 getInitialState:初始化每个实例特有的状态 componentWillMount:render之前最后一次修改 ...