mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 08:47:12 +03:00
6efcd59b56
A user recently got confused and managed to track and export a .git directory, which confuses git and causes it to emit very odd errors. For example, cloning one such repository (which has a symlink for .git) produces this output from git: Cloning into 'git'... done. error: Updating '.git' would lose untracked files in it and another (which has a .git directory checked in) produces this: Cloning into 'git'... done. error: Invalid path '.git/hooks/post-update' If it ended there, that'd be fine, but this led to a line of investigation that ended with CVE-2014-9390, so now git will block checking these revisions out, so we should try to prevent foot-shooting on our end. Since some servers (notably github) are blocking trees that contain these entries, default to refusing to export any path component that looks like it folds to .git. Since some histories probably contain this already, we offer an escape hatch via the config option git.blockdotgit that allows users to resume foot-shooting behavior.
25 lines
881 B
Python
25 lines
881 B
Python
try:
|
|
from mercurial import encoding
|
|
hfsignoreclean = encoding.hfsignoreclean
|
|
except AttributeError:
|
|
# compat with hg 3.2.1 and earlier, which doesn't have
|
|
# hfsignoreclean (This was borrowed wholesale from hg 3.2.2.)
|
|
_ignore = [unichr(int(x, 16)).encode("utf-8") for x in
|
|
"200c 200d 200e 200f 202a 202b 202c 202d 202e "
|
|
"206a 206b 206c 206d 206e 206f feff".split()]
|
|
# verify the next function will work
|
|
assert set([i[0] for i in _ignore]) == set(["\xe2", "\xef"])
|
|
|
|
def hfsignoreclean(s):
|
|
"""Remove codepoints ignored by HFS+ from s.
|
|
|
|
>>> hfsignoreclean(u'.h\u200cg'.encode('utf-8'))
|
|
'.hg'
|
|
>>> hfsignoreclean(u'.h\ufeffg'.encode('utf-8'))
|
|
'.hg'
|
|
"""
|
|
if "\xe2" in s or "\xef" in s:
|
|
for c in _ignore:
|
|
s = s.replace(c, '')
|
|
return s
|