9 Star 46 Fork 30

开源中国 / repo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
Development_Manual.md 3.30 KB
一键复制 编辑 原始数据 按行查看 历史
MarineJ 提交于 2020-09-04 11:58 . Handling conflicts

开发手册

0、关于repo脚本

通过curl下载的repo命令只是一个引导脚本,执行命令时会在workspace中去寻找通过repo init 下载的真正的repo代码,进行命令的真正触发

1、二开关键部分

.
├── command.py
├── git_command.py
├── error.py
├── manifest_xml.py
├── project.py
└── subcmds
    ├── __init__.py
    ├── config.py
    ├── gitee_pr.py
    ├── push.py
    ├── start.py
    ├── upload.py
    └── version.py

command

subcmds目录下所有命令的父类

git_command

对间接调用git命令的封装模块

error

异常类

manifest_xml

manifest_xml文件的解析模块

project

项目模型模块,与项目相关的基础操作模块

subcmds

repo 的子命令都在此目录下

init.py

from subcmds 时对all_commands字典初始化,完成repo command与subcmds下命令模块的映射

config

repo config 命令对应模块

gitee_pr

repo gitee-pr 命令对应模块

push

repo push 命令对应模块

... 后面的子命令对应关系以此类推

2、具体开发案例

repo push 举例

def Execute(self, opt, args):
    project_list = self.GetProjects(args)  #获取repo push仓库列表

    if opt.branch:  # 判断是否传入了branch参数
        branch = opt.branch

    if opt.force:   # 判断是否传入force参数
      if len(project_list) != 1:
        print('error: --force requires exactly one project', file=sys.stderr)
        sys.exit(1)

    if branch:
        for project in project_list:  
          branch_tmp = branch
          if (not opt.new_branch and
                  project.GetUploadableBranch(branch) is None):  # 判断仓库是否有可推送的分支,当有new_branch参数时另外处理
            continue
          branch_tmp = project.GetBranch(branch_tmp)
          if branch_tmp.LocalMerge:
            rb = ReviewableBranch(project, branch_tmp, branch_tmp.LocalMerge)  # 推送分支实例
            pending.append((project, [rb]))  # 加入待推送队列
    if not pending:
      print("no branches ready for upload", file=sys.stderr)
    elif len(pending) == 1 and len(pending[0][1]) == 1:  #进行单个推送或是批量推送
      self._SingleBranch(opt, pending[0][1][0], reviewers)
    else:
      self._MultipleBranches(opt, pending, reviewers)
......

以上是我截取的repo push命令的主要逻辑,同时类比subcmds下的命令都是类似的逻辑
1、通过args参数获取需要处理的project_list(获取需要处理的仓列表)
2、通过opt参数,判断命令是否选择了相关的option进行进一步判断,进行数据处理(构造需要推送的分支)
3、拿到构造好的的待处理的数据,进行命令的主要逻辑(开始推送)

3、相关资料

git权威指南资料 Android式多版本库协同章节其中介绍了repo
地址:http://www.worldhello.net/gotgit/04-git-model/060-android-model.html

当前版本repo 命令参考文档 :
地址:https://source.android.google.cn/setup/develop/repo?hl=zh-cn

gerrit dockerhub:
https://hub.docker.com/r/gerritcodereview/gerrit

AGit-Flow:
https://git-repo.info/zh_cn/2020/03/agit-flow-and-git-repo/
可惜只能用在AGit-Flow上

Python
1
https://gitee.com/oschina/repo.git
git@gitee.com:oschina/repo.git
oschina
repo
repo
fork_flow

搜索帮助