目標:
找出所有 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
沒有留言:
張貼留言