firmware-base/vendor/sming/Sming/docs/source/filemap.py
2026-01-28 16:42:43 +01:00

83 lines
2.3 KiB
Python

#
# Build map of output files to source URLs so that edit links are created correctly
#
import os
import sys
import subprocess
import shutil
SMINGDIR = "../.."
GIT = shutil.which('git')
def gitcmd(args, **kwargs):
kwargs['stdout'] = subprocess.PIPE
with subprocess.Popen([GIT] + args, **kwargs) as child:
return child.stdout.read().decode()
def urljoin(elements):
res = ''
for e in elements:
if e == '':
continue
if res != '' and not res.endswith('/'):
res += '/'
res += e
return res
def getRemotePath(srcdir):
path = gitcmd(['rev-parse', '--show-prefix'], cwd=srcdir).strip()
return path.rstrip('/')
def getRemoteUrl(srcdir):
url = gitcmd(['config', '--get', 'remote.origin.url'], cwd=srcdir).strip()
return os.path.splitext(url)[0] # Remove .git if present
def getRemoteCommit(srcdir):
return gitcmd(['describe', '--always', 'HEAD'], cwd=srcdir).strip()
# Get map of directories to submodule URLs
def buildFileMap(ctx):
rootmap = {}
# index.rst files may be generated from README.md or README.rst
def getSourceFilename(srcdir, filename):
if filename != 'index.rst':
return filename
if os.path.exists(f"{srcdir}/README.md"):
return 'README.md'
if os.path.exists(f"{srcdir}/README.rst"):
return 'README.rst'
return filename
filemap = {}
for dirpath, dirnames, filenames in os.walk('_inc'):
srcpath = dirpath[5:] # skip '_inc/'
srcdir = os.path.join(SMINGDIR, srcpath)
# print(f"srcdir = {srcdir}", file=sys.stderr)
remotePath = getRemotePath(srcdir)
url = getRemoteUrl(srcdir)
commit = getRemoteCommit(srcdir)
if remotePath:
srcpath = srcpath.rsplit(remotePath)[0].rstrip('/')
rootmap[srcpath] = urljoin([url, 'tree', commit])
for f in filenames:
s = urljoin([url, 'blob', commit, remotePath, getSourceFilename(srcdir, f)])
filemap[f"{dirpath}/{f}"] = s
# for k, v in filemap.items():
# print(f"{k}: {v}", file=sys.stderr)
# for k, v in rootmap.items():
# print(f"{k}: {v}", file=sys.stderr)
ctx['page_urls'] = filemap
ctx['root_urls'] = rootmap
ctx['root_paths'] = sorted(rootmap.keys(), reverse=True)