1.概述
init指令是接觸repo所使用的第一個指令,它完成manifest倉庫的下載下傳/更新以及.repo路徑下各子目錄結構的維護(manifest.git/manifests/default.xml),為後續執行sync下載下傳指令完成準備工作。
2.資料結構
init指令即為subcmds路徑下init.py中定義的類,它所生成的對象會在main.py中被指派給cmd,并與cmd的屬性 XmlManifest類型的對象manifest 配合完成manifest倉庫的下載下傳/更新。是以init類本身沒有涉及新的資料結構,有一點差異化的就是會定義重載的_Option方法來更新參數對象opt的資料結構,以便解析init指令獨有的參數。
3.主體思路
git_require (檢查git版本) -->
_SyncManifest(opt) (根據接收的opt參數下載下傳/更新manifest倉庫)-->
_LinkManifest(opt.manifest_name)(完成default.xml 連結到實際xml檔案的操作)-->
_ConfigureUser / _ConfigureColor / _ConfigureDepth (配置本地git使用者/顔色/下載下傳深度等)-->
針對_SyncManifest(opt) :
判斷manifest倉庫本地是否已下載下傳(self.manifest.manifestProject.Exists)-->
分支:如果本地沒有已經下載下傳的manifest倉庫,則首先檢查opt參數,如manifest倉的url位址、quiet模式等;參數檢查沒有異常即進行本地倉庫初始化 self.manifest.manifestProject._InitGitDir();最後确認manifest倉的revision指向。
分支:如果本地已有下載下傳過的manifest倉庫,則進行revision指向确認。
-->更新manifest倉庫remote資訊-->
判斷是否為reference下載下傳模式或者mirror下載下傳模式-->
依次進行網絡部分下載下傳、Buffer處理、本地部分更新等操作 (Sync_NetworkHalf SyncBuffer Sync_LocalHalf)
4.算法