阻止对单个mercurial存储库中特定分支的写访问

时间:2009-09-28 18:29:59

标签: security mercurial

是否有可能在mercurial中编写某种方式来拒绝影响存储库中特定命名分支的变更集?

我们有一个托管项目,并且希望允许任何开发人员将他们的更改推送到我们的存储库,只要他们在他们自己的命名分支中。这允许我们在同一个存储库中管理单个buildbot和共享沙箱(通过保持分支分开)。我们想阻止任何从外部人员写入默认分支的尝试(我们会在内部合并他们的分支)。

我们正在考虑使用pretxnchangegroup钩子,但这有两个问题:

1)用户可以使用任何用户名推送更改;我们基本上只有一个http-auth保护存储库,要求任何用户名或密码实际连接到repo,但它不会检查提交中的用户名,以确保它们与用于推送的帐户匹配。

2)让我们说用户已经做了正确的事情并在分支中开发,但随后他们在默认分支上进行最后一次提交。 hg push失败。此时开发人员采取了哪些措施来解决问题呢?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

是的,你可以像你想象的pretxnchangegroup那样轻松地做到这一点。我将在shell中执行它,但如果你在python中执行它,它将在进程中(因此更快)。

将这样的东西设置为您的pretxnchangegroup:

#!/bin/sh
for thenode in $(hg log -r $HG_NODE:tip --template '{node}\n') ; do
     if [ $(hg id --branch -r $thenode) = "default" ] ; then
          echo Commits to default branch are not allowed -- bad changeset $thenode
          exit 1
     fi
done

确保没有任何到达的变更集在分支“默认”上。

关于问题1:如果您在apache后面运行,您将可以访问通常的CGI变量,因此您可以检查$ REMOTE_USER以确保它与分支名称匹配,如果您想要尝试强制执行。< / p>

关于问题2:如果用户看到他们正在推送无效变更集的消息,那么他们只需要使用push -r推送剩余的变更集,他们可以在默认情况下剥离或修改其变更集后面。

最后,您是否考虑过为自动构建/主分支设置单独的克隆?让每个人都进入临时仓库,只有当他/她满意的时候,只有构建管理员将批准的变更集从暂存变为自动构建?您获得了与现在相同的工作流程(等待构建器合并),但它的麻烦要少得多。