Swift 的首次贡献

获取 Swift

Swift 的源代码托管在 github 上,并使用 git 进行管理。当前的主干可以像这样检出:

git clone https://github.com/openstack/swift.git

这将把 Swift 仓库克隆到您的账户下。

Swift 最新版本的源代码压缩包在 launchpad 项目页面 上可用。

提供适用于 Ubuntu 和 RHEL 变体的预构建软件包。

源代码控制设置

Swift 使用 git 进行源代码控制。OpenStack 开发者指南 描述了设置 Git 以及为 Swift 贡献代码所需的所有账户的步骤。

对 Swift 的修改

一旦您设置了源代码和源代码控制,就可以对 Swift 进行修改了。

测试

开发指南》描述了在提交 Swift 代码之前所需的测试要求。

总而言之,您可以从 Swift 的主目录(您检出源代码的位置)执行 tox

tox

Tox 将呈现测试结果。请注意,在开始时,经常会违反许多编码风格指南。

向 Swift 提出更改

OpenStack 开发者指南 描述了您将需要的最常见的 git 命令。

以下是您首次向 Swift 贡献所需的命令列表

要克隆 Swift 的副本

git clone https://github.com/openstack/swift.git

在 swift 目录下,设置 Gerrit 仓库。以下命令配置仓库以了解 Gerrit 并安装 Change-Id 提交钩子。您只需要执行一次

git review -s

要创建您的开发分支(将 branch_name 替换为您选择的名称)

git checkout -b <branch_name>

要检查分支中已更新的文件

git status

要检查分支与仓库之间的差异

git diff

假设您没有添加新文件,您可以使用以下命令提交所有更改:

git commit -a

请阅读 Git 提交消息结构摘要,了解编写提交消息的最佳实践。准备好发送您的更改以供审核时,请使用

git review

如果成功,Git 响应消息将包含您可以用来跟踪您的更改的 URL。

如果您需要对同一审核进行进一步的更改,可以使用以下命令提交它们:

git commit -a --amend

这将使用您之前发出的相同更改集提交更改。请注意,为了发送您的最新版本以供审核,您仍然需要调用

git review

跟踪您的更改

在向 Swift 提出更改后,您可以在 https://review.opendev.org 上跟踪它们。登录后,您将看到“待处理的审核”仪表板,其中包含您提出的更改,“传入的审核”仪表板,其中包含您正在审核的更改,以及“最近关闭”仪表板,其中包含您作为审核员或所有者参与的更改。

重新基于后的说明

重新基于后,应执行以下步骤以重建 Swift 安装。请注意,这些命令应从 Swift 仓库的根目录执行(例如 $HOME/swift/

sudo python setup.py develop
sudo pip install -r test-requirements.txt

如果使用 TOX,根据重新基于期间的更改,您可能需要重建 TOX 环境(通常,如果 test-requirements.txt 已更新,以至于需要软件包的新版本,则会发生这种情况),可以使用 TOX cli 的 -r 参数来完成此操作

tox -r

您可以包含任何其他 TOX 参数,例如,要运行 pep8 套件并重建 TOX 环境,可以使用以下命令:

tox -r -e pep8

仅需要为特定构建(例如,pep8)指定重建选项一次,即同一构建的进一步调用不需要这样做,直到下一次重新基于为止。

故障排除

如果您使用以下命令重新基于提交,则在启动 Swift 时可能会遇到以下错误:

git rebase
Traceback (most recent call last):
    File "/usr/local/bin/swift-init", line 5, in <module>
        from pkg_resources import require
    File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2749, in <module>
        working_set = WorkingSet._build_master()
    File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 446, in _build_master
        return cls._build_from_requirements(__requires__)
    File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 459, in _build_from_requirements
        dists = ws.resolve(reqs, Environment())
    File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 628, in resolve
        raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: swift==2.3.1.devXXX

(其中 XXX 代表 Swift 的开发版本)。

Traceback (most recent call last):
    File "/usr/local/bin/swift-proxy-server", line 10, in <module>
      execfile(__file__)
    File "/home/swift/swift/bin/swift-proxy-server", line 23, in <module>
      sys.exit(run_wsgi(conf_file, 'proxy-server', **options))
    File "/home/swift/swift/swift/common/wsgi.py", line 888, in run_wsgi
      loadapp(conf_path, global_conf=global_conf)
    File "/home/swift/swift/swift/common/wsgi.py", line 390, in loadapp
      func(PipelineWrapper(ctx))
    File "/home/swift/swift/swift/proxy/server.py", line 602, in modify_wsgi_pipeline
      ctx = pipe.create_filter(filter_name)
    File "/home/swift/swift/swift/common/wsgi.py", line 329, in create_filter
      global_conf=self.context.global_conf)
    File "/usr/lib/python2.7/dist-packages/paste/deploy/loadwsgi.py", line 296, in loadcontext
      global_conf=global_conf)
    File "/usr/lib/python2.7/dist-packages/paste/deploy/loadwsgi.py", line 328, in _loadegg
      return loader.get_context(object_type, name, global_conf)
    File "/usr/lib/python2.7/dist-packages/paste/deploy/loadwsgi.py", line 620, in get_context
      object_type, name=name)
    File "/usr/lib/python2.7/dist-packages/paste/deploy/loadwsgi.py", line 659, in find_egg_entry_point
      for prot in protocol_options] or '(no entry points)'))))
LookupError: Entry point 'versioned_writes' not found in egg 'swift' (dir: /home/swift/swift; protocols: paste.filter_factory, paste.filter_app_factory; entry_points: )

这是因为 git rebase 将检索开发流中不同版本的 Swift 的代码,但 /usr/local/bin 下的启动脚本尚未更新。解决方案是按照 重新基于后的说明 部分中描述的步骤进行操作。