我正在准备Python脚本,该脚本将从git commits日志中比较文件,并将差异写入漂亮的html文件中。
我想对源代码进行着色,类似于在GitHub diff上进行着色,为此,我想使用pygments。只有一个问题,它将需要有关编写源代码的语言的信息,因此我必须以某种方式获取它。
我想知道是否有可能直接从存储库的本地副本(首选)或GitHub本身获取它。GitHub正在使用语言学家,所以工作已经完成了,为什么不使用它呢?此外,当我们从GitHub UI界面上的语言栏信息下方输入特定的语言链接时,您可以清楚地看到所有被识别为使用所选语言编写的文件。
我看到了一些有关.gitattributes
文件的信息,您可以在其中设置文件的语言,但是我需要手动设置它,并且在项目更新后,我必须用所有添加的文件来更新该文件。
我写完这个问题后,立即找到了GitHub REST API。即使我还没有找到可以按原样提供文件语言的功能。我发现可以结合使用两种GitHub REST API方法:
我将在下面基于python实现对其进行描述。
import requests
import json
def check_file_lang(filename: str, repo: str):
response = requests.get("https://api.github.com/repos/{}/languages".format(repo))
lang = json.loads(response.text)
for lang in lang.keys():
response = requests.get("https://api.github.com/search/code?q=%20+filename:{}+repo:{}+language:{}".format(filename,
repo,
lang))
search_result = json.loads(response.text)
if search_result['total_count'] == 1:
return lang
f = "Gruntfile.js"
r = "jquery/jquery"
file_lang = check_file_lang(f, r)
print(file_lang)
与此相关的一个问题是,当存储库使用多种语言时,有可能无法完成此请求。由于GitHub限制了每分钟的请求数(未认证== 10和已认证== 30),因此可能有很多请求需要检查存储库中的所有语言。GitHub REST API速率限制此外,即使存储库只有一种语言,每个文件仍然需要2个请求,这意味着您每分钟最多可以检查5或15个文件。
之后,尽管我会更好地根据提供的语言从存储库返回所有文件,但是GitHub限制了查询GitHub REST API超时和不完整的结果,这意味着对于大型项目,您的数据可能会被截断,因此您无法知道存储库中的所有文件。
def list_all_files_by_language(repo: str):
response = requests.get("https://api.github.com/repos/{}/languages".format(repo))
lang = json.loads(response.text)
ret_dict = {}
for lang in lang.keys():
response = requests.get("https://api.github.com/search/code?q=%20+repo:{}+language:{}".format(repo,
lang))
search_result = json.loads(response.text)
if 'items' in search_result.keys():
ret_dict[lang] = search_result['items']
return ret_dict
解决方案有其缺陷,但可以起作用。如果有人能找到更好的东西,我很想尝试一下。
目前,我接受此答复是因为它符合我的需求,因为GitHub Enterprise(这是我的用例)没有提到局限性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句