hgrc 中的 mercurial 多个用户名
mercurial multiple usernames in hgrc
我正在访问多个 Mercurial 存储库,根据主机名,我想配置我在每个存储库上显示的名称和电子邮件地址。
显而易见的解决方案是将 'username' 添加到每个 repo 的 hgrc 文件的 ui 部分,但我不想依赖它,因为这些沙箱时不时地被删除。
因此,我需要一个可以将所有这些放在一起的中心位置。理想情况下,我想要一个可以将主机名映射到用户特定 hgrc 文件 (~/.hgrc) 中的用户名的解决方案。
这可能吗?
此致,
[编辑]
是的,@cyon 的回答完成了这项工作。我刚刚更新它以处理 'ssh://user@' 类型的 url,并且在克隆命令中没有目标文件夹时也能应对。
def merc_host_to_username_mapper(**kwargs):
host_to_username_map={'bitbucket.org' : 'your name <name@mail.com>'}
hg_pats = kwargs['pats']
merc_url = hg_pats[0]
merc_path_list = merc_url.split('://', 1)
if len(merc_path_list) == 1:
#print('ret1')
return
merc_sub_path = merc_path_list[-1].split('@',1)[-1]
while True:
#print('sub_path: ', merc_sub_path)
if merc_sub_path in host_to_username_map:
#print('found path, breaking')
break
else:
if len(merc_sub_path.rsplit('/', 1)) == 1:
#print('ret2')
return
else:
merc_sub_path = merc_sub_path.rsplit('/', 1)[0]
if len(hg_pats) is 1:
for folder in reversed(hg_pats[0].split('/')):
if folder:
hg_pats.append(folder)
#print('breaking ',folder)
break
if len(hg_pats) is 1:
#print('ret3')
return
#print('hg_pats: ', hg_pats)
with open(hg_pats[1] + "/.hg/hgrc", "a") as hgrc:
print("adding username \'" + host_to_username_map[merc_sub_path] + '\' to hgrc');
hgrc.write("[ui]\n");
hgrc.write("username=" + host_to_username_map[merc_sub_path] + "\n");
您可以使用 post-clone
挂钩自动将 'username' 添加到每个 repo 的 hgrc 的 ui 部分。
然后这个挂钩会给你一个地方来保存从 repo 到用户名的集中映射。
代码可能如下所示:
~/.hgrc:
[hooks]
post-clone=python:/path/to/script/name_chooser.py:chooser
name_chooser.py:
def chooser(**kwargs):
map={'https://bitbucket.org/yourrepo' : 'your_user'}
hg_pats = kwargs['pats']
if hg_pats[0] not in map:
return
with open(hg_pats[1] + "/.hg/hgrc", "a") as hgrc:
hgrc.write("[ui]\n");
hgrc.write("username=" + map[hg_pats[0]] + "\n");
kwargs['pats']
是 hg clone
命令的参数列表。在此代码中,我假设您像这样调用克隆:
hg clone https://bitbucket.org/yourrepo local_repo_path
我正在访问多个 Mercurial 存储库,根据主机名,我想配置我在每个存储库上显示的名称和电子邮件地址。
显而易见的解决方案是将 'username' 添加到每个 repo 的 hgrc 文件的 ui 部分,但我不想依赖它,因为这些沙箱时不时地被删除。
因此,我需要一个可以将所有这些放在一起的中心位置。理想情况下,我想要一个可以将主机名映射到用户特定 hgrc 文件 (~/.hgrc) 中的用户名的解决方案。
这可能吗?
此致,
[编辑] 是的,@cyon 的回答完成了这项工作。我刚刚更新它以处理 'ssh://user@' 类型的 url,并且在克隆命令中没有目标文件夹时也能应对。
def merc_host_to_username_mapper(**kwargs):
host_to_username_map={'bitbucket.org' : 'your name <name@mail.com>'}
hg_pats = kwargs['pats']
merc_url = hg_pats[0]
merc_path_list = merc_url.split('://', 1)
if len(merc_path_list) == 1:
#print('ret1')
return
merc_sub_path = merc_path_list[-1].split('@',1)[-1]
while True:
#print('sub_path: ', merc_sub_path)
if merc_sub_path in host_to_username_map:
#print('found path, breaking')
break
else:
if len(merc_sub_path.rsplit('/', 1)) == 1:
#print('ret2')
return
else:
merc_sub_path = merc_sub_path.rsplit('/', 1)[0]
if len(hg_pats) is 1:
for folder in reversed(hg_pats[0].split('/')):
if folder:
hg_pats.append(folder)
#print('breaking ',folder)
break
if len(hg_pats) is 1:
#print('ret3')
return
#print('hg_pats: ', hg_pats)
with open(hg_pats[1] + "/.hg/hgrc", "a") as hgrc:
print("adding username \'" + host_to_username_map[merc_sub_path] + '\' to hgrc');
hgrc.write("[ui]\n");
hgrc.write("username=" + host_to_username_map[merc_sub_path] + "\n");
您可以使用 post-clone
挂钩自动将 'username' 添加到每个 repo 的 hgrc 的 ui 部分。
然后这个挂钩会给你一个地方来保存从 repo 到用户名的集中映射。
代码可能如下所示:
~/.hgrc:
[hooks]
post-clone=python:/path/to/script/name_chooser.py:chooser
name_chooser.py:
def chooser(**kwargs):
map={'https://bitbucket.org/yourrepo' : 'your_user'}
hg_pats = kwargs['pats']
if hg_pats[0] not in map:
return
with open(hg_pats[1] + "/.hg/hgrc", "a") as hgrc:
hgrc.write("[ui]\n");
hgrc.write("username=" + map[hg_pats[0]] + "\n");
kwargs['pats']
是 hg clone
命令的参数列表。在此代码中,我假设您像这样调用克隆:
hg clone https://bitbucket.org/yourrepo local_repo_path