repo与git(三)repo源码详解

个人邮箱:xiaokeweng@gmail.com

下来进行代码的详细分析,就算你不懂python看着注释,也能理解个大概。粗略的来说,这段repobootstrap的目的就是装配真正的repo目录,也就是当你在某个目录下想要拉代码的时候,你会敲入:repoinit,实质上是去访网站并down整个.repo目录。另外还有repohelp功能。好现在开始看代码~


1)上面所述在上一篇中详细介绍过,主要是实现了shellpython的过渡,接下来的由python接手。

#!/bin/sh 

## repo default configuration 
## 
REPO_URL='https://gerrit.googlesource.com/git-repo' 
REPO_REV='stable' 

magic='--calling-python-from-/bin/sh--' 
"""exec" python -E "$0" "$@" """#$magic"

2)这部分实判断是否是主动执行,还是作为其他脚本的声名库,类似被其他脚本声明,而不是执行。

#
if __name__ == '__main__': 
  import sys 
  if sys.argv[-1] == '#%s' % magic: 
    del sys.argv[-1] 
del magic 

3)接下来一直到最后两行的所有部分为函数定义,还有变量设定,脚本读入参数的接收规则等等,都是将在main中服务的,最后两行使得,我们切入到最后的main函数:

if __name__ == '__main__': 
  main(sys.argv[1:])						
#全部将参数传入,[1:]表示从头到尾

4)而后转入main函数,整个main函数中,主要进行的是基本配置的检测,参数检测等等,而实质上并没有进行任何功能性的操作,最后是跳转到了main.py。其中的每个函数都在本文件中定义了。

############  MAIN  ################# 
def main(orig_args): 
  repo_main, rel_repo_dir = _FindRepo() 
# (1)main.py的绝对路径 (2).repo的绝对路径 

  cmd, opt, args = _ParseArguments(orig_args) 
# 返回:cmd-首个不以"-"开头的参数 
#       opt-help=True/False 
#       arg-cmd的之后的参数序列 

  wrapper_path = os.path.abspath(__file__) 
# 本文件的全路径 

  my_main, my_git = _RunSelf(wrapper_path) 
# 获取 main.py .git 的全路径(保证在存在'git_config.py','project.py','subcmds') 
 
  if not repo_main: 
    if opt.help: 
      _Usage() 
    if cmd == 'help': 
      _Help(args) 
    if not cmd: 
      _NotInstalled() 
# 提示 "repo init" 
    if cmd == 'init': 
      if my_git: 
        _SetDefaultsTo(my_git) 
# 保存 repo/.git 下的branch 值到 REPO_REV:HEAD 
      try: 
        _Init(args) 
      except CloneFailure: 
        for root, dirs, files in os.walk(repodir, topdown=False): 
          for name in files: 
            os.remove(os.path.join(root, name)) 
          for name in dirs: 
            os.rmdir(os.path.join(root, name)) 
        os.rmdir(repodir) 
        sys.exit(1) 
      repo_main, rel_repo_dir = _FindRepo() 
    else: 
      _NoCommands(cmd) 
# 出错问题 

  if my_main: 
    repo_main = my_main 

  ver_str = '.'.join(map(lambda x: str(x), VERSION)) 
  me = [repo_main, 
        '--repo-dir=%s' % rel_repo_dir, 
        '--wrapper-version=%s' % ver_str, 
        '--wrapper-path=%s' % wrapper_path, 
        '--'] 
  me.extend(orig_args) 
  me.extend(extra_args) 
  try: 
    os.execv(repo_main, me) 
# 将权限转到 main.py 
  except OSError as e: 
    print >>sys.stderr, "fatal: unable to start %s" % repo_main 
    print >>sys.stderr, "fatal: %s" % e 
    sys.exit(148) 



从这里才算是具有真正的功能性的部分,如图所示的整体部分就是了,包括了全部的功能,说实话平时能用到的命令或者功能並不算多,我也就没有一一查看每一个文件。


我们在来捋顺一下repo的使用,首先电脑上面安装的是一个几百行的bootstrap,一般放在~/bin下,这样就能被我们的环境变量访问到,而后每当我们想要使用repo的功能时候(一般先使用的功能应该是拉工程代码),我们先要在某个目录下repoinit,也就是通过bootstrapmanfeast指定的urldown下功能完整的repo目录,这样子就指定了你的远程目标工程文件,当你reposync的时候,就会去访问并down下来整个工程。


repo只是一个工具,它是应运android的方便管理而产生的,全部的功能都是基于git的,简单的说就是repo是统一管理操作android工程下面各个git的用户接口。

ps:致歉--本来想详细的解读每一个功能的,后来因为其他事情,耽搁了一段时间,现在回来又有点陌生了~哈哈,老了,不中用了…草草的结束repo的分析吧~,如果您有兴趣可以邮件我,我们可以共同探讨,学习。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值