ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2011年3月30日 星期三

check if every git projects are list in repo manifest

先試一下 是不是所有的 source code 都有在 git 控制下:

目標:

找出所有 git versionize 的 project (folder) 和沒有 git versionize 的 folder。

Rule:

該 folder 有 .git 目錄,則該 folder 為 project root
到 tree end (沒有任何 subfolder) 都沒有 .git 目錄,則該 folder 就沒有 versionize.

os.walk( ) 的搜尋有 top-down 和 buttom-up.

使用 top-down,在 path walk 中可以即時更改 dirlist..

找dirlist 中每個 item (folder),該 folder 下有 .git 目錄,就從 dirlist 中刪掉 (remove).

如果 是 end node ( len(dirlist) == 0 ) 就是 not versionize folder.

寫起來就是:
import os gitproj=[] emptyproj = [] if os.path.isdir(".git"): gitproj.append("./") else: for root, dirlist, filelist in os.walk("./"): for ingpath in ['.repo','out']: if ingpath in dirlist: dirlist.remove(ingpath) if len(dirlist) == 0 : emptyproj.append(root) else: foundpath=[] for dirname in dirlist: if os.path.isdir(os.path.join(root,dirname,'.git')): foundpath.append(dirname) for dirname in foundpath: dirlist.remove(dirname) gitproj.append(os.path.join(root,dirname)) print emptyproj print '==============' print len(gitproj)

但是很神奇的,check patch 後的 folder,, 每個 folder 都有被 git versionzie 耶!!!
.. 所以是我寫錯?


這個比較有趣的地方是 (作為一個初學者):for.. in os.walk 的動作,在 top-down 模式,允許你修改 在 loop 中修改 dirlist 的內容,這樣他就不會 walk in 那些不在 dirlist 的 path.



接著,是不是所有的 git project 都有列在 repo 的 manifest 裡:

import os import sys import xml.dom.minidom # STEP 1 : get all project path in manifest.xml xmlroot = xml.dom.minidom.parse('./.repo/manifest.xml') manifestprojlist=[] for node in xmlroot.childNodes[0].childNodes: if node.nodeName == 'project': manifestprojlist.append(os.path.join('./',node.getAttribute('path'))) # STEP 2 : search all the source tree to get the .git project list emptylist = [] gitlist = [] for root, dirlist, filelist in os.walk('./'): for ingpath in ['.repo','out']: if ingpath in dirlist: dirlist.remove(ingpath) if len(dirlist) == 0: emptylist.append(root) else: foundpath=[] for dirname in dirlist: if os.path.isdir(os.path.join(root,dirname,'.git')): foundpath.append(dirname) gitlist.append(os.path.join(root,dirname)) # STEP 3 : compare and print result for projname in gitlist: if projname not in manifestprojlist: print projname
結果真的有...除了 kernel 和 bootloader 外,還有 10 個 git project

沒有留言:

標籤

網誌存檔