summaryrefslogtreecommitdiff
path: root/.gitignore
diff options
context:
space:
mode:
authorGreg Price <gnprice@gmail.com>2019-09-11 02:25:26 -0700
committerZachary Ware <zachary.ware@gmail.com>2019-09-11 10:25:26 +0100
commit455122a0094c8cfdf7e062eccc5e5b5885c75e8b (patch)
tree614cc88f2c4b77bdf6438559e3047c0bdf39d819 /.gitignore
parent580d2782f70f8e0bed7ec20abb03d740cb83b5da (diff)
downloadcpython-git-455122a0094c8cfdf7e062eccc5e5b5885c75e8b.tar.gz
bpo-37936: Systematically distinguish rooted vs. unrooted in .gitignore (GH-15823)
A root cause of bpo-37936 is that it's easy to write a .gitignore rule that's intended to apply to a specific file (e.g., the `pyconfig.h` generated by `./configure`) but actually applies to all similarly-named files in the tree (e.g., `PC/pyconfig.h`.) Specifically, any rule with no non-trailing slashes is applied in an "unrooted" way, to files anywhere in the tree. This means that if we write the rules in the most obvious-looking way, then * for specific files we want to ignore that happen to be in subdirectories (like `Modules/config.c`), the rule will work as intended, staying "rooted" to the top of the tree; but * when a specific file we want to ignore happens to be at the root of the repo (like `platform`), then the obvious rule (`platform`) will apply much more broadly than intended: if someone tries to add a file or directory named `platform` somewhere else in the tree, it will unexpectedly get ignored. That's surprising behavior that can make the .gitignore file's behavior feel finicky and unpredictable. To avoid it, we can simply always give a rule "rooted" behavior when that's what's intended, by systematically using leading slashes. Further, to help make the pattern obvious when looking at the file and minimize any need for thinking about the syntax when adding new rules: separate the rules into one group for each type, with brief comments identifying them. For most of these rules it's clear whether they're meant to be rooted or unrooted, but in a handful of cases I've only guessed. In that case the safer default (the choice that won't hide information) is the narrower, rooted meaning, with a leading slash. If for some of these the unrooted meaning is desired after all, it'll be easy to move them to the unrooted section at the top.
Diffstat (limited to '.gitignore')
-rw-r--r--.gitignore103
1 files changed, 55 insertions, 48 deletions
diff --git a/.gitignore b/.gitignore
index 54c598e109..0e3f973d0f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,14 @@
-# Two-trick pony for OSX and other case insensitive file systems:
-# Ignore ./python binary on Unix but still look into ./Python/ directory.
-/python
-!/Python/
+#####
+# First, rules intended to apply in all subdirectories.
+# These contain no slash, or only a trailing slash.
*.cover
*.iml
*.o
+*.a
+*.so*
+*.dylib
+*.dll
*.orig
*.pyc
*.pyd
@@ -18,6 +21,31 @@
*.profraw
*.dyn
.gdb_history
+.purify
+__pycache__
+.hg/
+.svn/
+.idea/
+tags
+TAGS
+.vs/
+.vscode/
+gmon.out
+.coverage
+.mypy_cache/
+
+*.exe
+!Lib/distutils/command/*.exe
+
+# Ignore core dumps... but not Tools/msi/core/ or the like.
+core
+!core/
+
+
+#####
+# Then, rules meant for a specific location relative to the repo root.
+# These must contain a non-trailing slash (and may also have a trailing slash.)
+
Doc/build/
Doc/venv/
Doc/.venv/
@@ -29,7 +57,7 @@ Lib/lib2to3/*.pickle
Lib/test/data/*
!Lib/test/data/README
/Makefile
-Makefile.pre
+/Makefile.pre
Misc/python.pc
Misc/python-embed.pc
Misc/python-config.sh
@@ -38,12 +66,9 @@ Modules/Setup.local
Modules/config.c
Modules/ld_so_aix
Programs/_freeze_importlib
-Programs/_freeze_importlib.exe
Programs/_testembed
-Programs/_testembed.exe
PC/python_nt*.h
PC/pythonnt_rc*.h
-PC/*/*.exe
PC/*/*.exp
PC/*/*.lib
PC/*/*.bsc
@@ -62,53 +87,35 @@ PCbuild/*-pgi
PCbuild/*-pgo
PCbuild/*.VC.db
PCbuild/*.VC.opendb
-PCbuild/.vs/
PCbuild/amd64/
PCbuild/arm32/
PCbuild/arm64/
PCbuild/obj/
PCbuild/win32/
Tools/unicode/data/
-.purify
-__pycache__
-autom4te.cache
-build/
-buildno
-config.cache
-config.log
-config.status
-config.status.lineno
-core
-!Tools/msi/core/
-db_home
-.hg/
-.idea/
-ipch/
-libpython*.a
-libpython*.so*
-libpython*.dylib
-libpython*.dll
-platform
-pybuilddir.txt
+/autom4te.cache
+/build/
+/config.cache
+/config.log
+/config.status
+/config.status.lineno
+/platform
+/pybuilddir.txt
/pyconfig.h
-python-config
-python-config.py
-python.bat
-python.exe
-python-gdb.py
-python.exe-gdb.py
-reflog.txt
-.svn/
-tags
-TAGS
-.coverage
-coverage/
-externals/
-htmlcov/
+/python-config
+/python-config.py
+/python.bat
+/python-gdb.py
+/python.exe-gdb.py
+/reflog.txt
+/coverage/
+/externals/
+/htmlcov/
Tools/msi/obj
Tools/ssl/amd64
Tools/ssl/win32
-.vs/
-.vscode/
-gmon.out
-.mypy_cache/
+
+# Two-trick pony for OSX and other case insensitive file systems:
+# Ignore ./python binary on Unix but still look into ./Python/ directory.
+/python
+!/Python/