Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
pytensor
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
testgroup
pytensor
Commits
824294dd
提交
824294dd
authored
12月 05, 2022
作者:
Maxim Kochurov
提交者:
Maxim Kochurov
12月 15, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update versioneer script
上级
350f4823
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
216 行增加
和
176 行删除
+216
-176
__init__.py
pytensor/__init__.py
+2
-4
_version.py
pytensor/_version.py
+58
-86
versioneer.py
versioneer.py
+156
-86
没有找到文件。
pytensor/__init__.py
浏览文件 @
824294dd
...
...
@@ -29,6 +29,8 @@ import sys
from
functools
import
singledispatch
from
typing
import
Any
,
NoReturn
,
Optional
from
pytensor.version
import
version
as
__version__
pytensor_logger
=
logging
.
getLogger
(
"pytensor"
)
logging_default_handler
=
logging
.
StreamHandler
()
...
...
@@ -49,10 +51,6 @@ def disable_log_handler(logger=pytensor_logger, handler=logging_default_handler)
logger
.
removeHandler
(
handler
)
# Version information.
from
pytensor.version
import
version
as
__version__
# Raise a meaningful warning/error if the pytensor directory is in the Python
# path.
rpath
=
os
.
path
.
realpath
(
__path__
[
0
])
...
...
pytensor/_version.py
浏览文件 @
824294dd
# This file helps to compute a version number in source trees obtained from
# git-archive tarball (such as those provided by githubs download-from-tag
# feature). Distribution tarballs (built by setup.py sdist) and build
# directories (produced by setup.py build) will contain a much shorter file
# that just contains the computed version number.
# This file is released into the public domain. Generated by
# versioneer-0.23.dev0 (https://github.com/python-versioneer/python-versioneer)
# This file is released into the public domain.
# Generated by versioneer-0.28
# https://github.com/python-versioneer/python-versioneer
"""Git implementation of _version.py."""
import
errno
import
functools
import
os
import
re
import
subprocess
import
sys
from
typing
import
Callable
,
Dict
import
functools
def
get_keywords
():
...
...
@@ -59,18 +61,17 @@ HANDLERS: Dict[str, Dict[str, Callable]] = {}
def
register_vcs_handler
(
vcs
,
method
):
# decorator
"""Create decorator to mark a method as the handler of a VCS."""
def
decorate
(
f
):
"""Store f in HANDLERS[vcs][method]."""
if
vcs
not
in
HANDLERS
:
HANDLERS
[
vcs
]
=
{}
HANDLERS
[
vcs
][
method
]
=
f
return
f
return
decorate
def
run_command
(
commands
,
args
,
cwd
=
None
,
verbose
=
False
,
hide_stderr
=
False
,
env
=
None
):
def
run_command
(
commands
,
args
,
cwd
=
None
,
verbose
=
False
,
hide_stderr
=
False
,
env
=
None
):
"""Call the given command(s)."""
assert
isinstance
(
commands
,
list
)
process
=
None
...
...
@@ -86,14 +87,10 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=
try
:
dispcmd
=
str
([
command
]
+
args
)
# remember shell=False, so use git.cmd on windows, not just git
process
=
subprocess
.
Popen
(
[
command
]
+
args
,
cwd
=
cwd
,
env
=
env
,
process
=
subprocess
.
Popen
([
command
]
+
args
,
cwd
=
cwd
,
env
=
env
,
stdout
=
subprocess
.
PIPE
,
stderr
=
(
subprocess
.
PIPE
if
hide_stderr
else
None
),
**
popen_kwargs
)
stderr
=
(
subprocess
.
PIPE
if
hide_stderr
else
None
),
**
popen_kwargs
)
break
except
OSError
:
e
=
sys
.
exc_info
()[
1
]
...
...
@@ -105,7 +102,7 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=
return
None
,
None
else
:
if
verbose
:
print
(
f
"unable to find command, tried {commands}"
)
print
(
"unable to find command, tried
%
s"
%
(
commands
,)
)
return
None
,
None
stdout
=
process
.
communicate
()[
0
]
.
strip
()
.
decode
()
if
process
.
returncode
!=
0
:
...
...
@@ -128,21 +125,15 @@ def versions_from_parentdir(parentdir_prefix, root, verbose):
for
_
in
range
(
3
):
dirname
=
os
.
path
.
basename
(
root
)
if
dirname
.
startswith
(
parentdir_prefix
):
return
{
"version"
:
dirname
[
len
(
parentdir_prefix
)
:],
return
{
"version"
:
dirname
[
len
(
parentdir_prefix
):],
"full-revisionid"
:
None
,
"dirty"
:
False
,
"error"
:
None
,
"date"
:
None
,
}
"dirty"
:
False
,
"error"
:
None
,
"date"
:
None
}
rootdirs
.
append
(
root
)
root
=
os
.
path
.
dirname
(
root
)
# up a level
if
verbose
:
print
(
"Tried directories
%
s but none started with prefix
%
s"
%
(
str
(
rootdirs
),
parentdir_prefix
)
)
print
(
"Tried directories
%
s but none started with prefix
%
s"
%
(
str
(
rootdirs
),
parentdir_prefix
))
raise
NotThisMethod
(
"rootdir doesn't start with parentdir_prefix"
)
...
...
@@ -155,7 +146,7 @@ def git_get_keywords(versionfile_abs):
# _version.py.
keywords
=
{}
try
:
with
open
(
versionfile_abs
)
as
fobj
:
with
open
(
versionfile_abs
,
"r"
)
as
fobj
:
for
line
in
fobj
:
if
line
.
strip
()
.
startswith
(
"git_refnames ="
):
mo
=
re
.
search
(
r'=\s*"(.*)"'
,
line
)
...
...
@@ -201,7 +192,7 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
# starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
# just "foo-1.0". If we see a "tag: " prefix, prefer those.
TAG
=
"tag: "
tags
=
{
r
[
len
(
TAG
)
:]
for
r
in
refs
if
r
.
startswith
(
TAG
)}
tags
=
{
r
[
len
(
TAG
):]
for
r
in
refs
if
r
.
startswith
(
TAG
)}
if
not
tags
:
# Either we're using git < 1.8.3, or there really are no tags. We use
# a heuristic: assume all version tags have a digit. The old git %d
...
...
@@ -210,7 +201,7 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
# between branches and tags. By ignoring refnames without digits, we
# filter out many common branch names like "release" and
# "stabilization", as well as "HEAD" and "master".
tags
=
{
r
for
r
in
refs
if
re
.
search
(
r
"\d"
,
r
)}
tags
=
{
r
for
r
in
refs
if
re
.
search
(
r
'\d'
,
r
)}
if
verbose
:
print
(
"discarding '
%
s', no digits"
%
","
.
join
(
refs
-
tags
))
if
verbose
:
...
...
@@ -218,31 +209,24 @@ def git_versions_from_keywords(keywords, tag_prefix, verbose):
for
ref
in
sorted
(
tags
):
# sorting will prefer e.g. "2.0" over "2.0rc1"
if
ref
.
startswith
(
tag_prefix
):
r
=
ref
[
len
(
tag_prefix
)
:]
r
=
ref
[
len
(
tag_prefix
):]
# Filter out refs that exactly match prefix or that don't start
# with a number once the prefix is stripped (mostly a concern
# when prefix is '')
if
not
re
.
match
(
r
"\d"
,
r
):
if
not
re
.
match
(
r
'\d'
,
r
):
continue
if
verbose
:
print
(
"picking
%
s"
%
r
)
return
{
"version"
:
r
,
return
{
"version"
:
r
,
"full-revisionid"
:
keywords
[
"full"
]
.
strip
(),
"dirty"
:
False
,
"error"
:
None
,
"date"
:
date
,
}
"dirty"
:
False
,
"error"
:
None
,
"date"
:
date
}
# no suitable tags, so version is "0+unknown", but full hex is still there
if
verbose
:
print
(
"no suitable tags, using unknown + full revision id"
)
return
{
"version"
:
"0+unknown"
,
return
{
"version"
:
"0+unknown"
,
"full-revisionid"
:
keywords
[
"full"
]
.
strip
(),
"dirty"
:
False
,
"error"
:
"no suitable tags"
,
"date"
:
None
,
}
"dirty"
:
False
,
"error"
:
"no suitable tags"
,
"date"
:
None
}
@register_vcs_handler
(
"git"
,
"pieces_from_vcs"
)
...
...
@@ -264,21 +248,19 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
env
.
pop
(
"GIT_DIR"
,
None
)
runner
=
functools
.
partial
(
runner
,
env
=
env
)
_
,
rc
=
runner
(
GITS
,
[
"rev-parse"
,
"--git-dir"
],
cwd
=
root
,
hide_stderr
=
True
)
_
,
rc
=
runner
(
GITS
,
[
"rev-parse"
,
"--git-dir"
],
cwd
=
root
,
hide_stderr
=
not
verbose
)
if
rc
!=
0
:
if
verbose
:
print
(
"Directory
%
s not under git control"
%
root
)
raise
NotThisMethod
(
"'git rev-parse --git-dir' returned error"
)
MATCH_ARGS
=
[
"--match"
,
"
%
s*"
%
tag_prefix
]
if
tag_prefix
else
[]
# if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
# if there isn't one, this yields HEX[-dirty] (no NUM)
describe_out
,
rc
=
runner
(
GITS
,
[
"describe"
,
"--tags"
,
"--dirty"
,
"--always"
,
"--long"
,
*
MATCH_ARGS
],
cwd
=
root
,
)
describe_out
,
rc
=
runner
(
GITS
,
[
"describe"
,
"--tags"
,
"--dirty"
,
"--always"
,
"--long"
,
"--match"
,
f
"{tag_prefix}[[:digit:]]*"
],
cwd
=
root
)
# --long was added in git-1.5.5
if
describe_out
is
None
:
raise
NotThisMethod
(
"'git describe' failed"
)
...
...
@@ -293,7 +275,8 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
pieces
[
"short"
]
=
full_out
[:
7
]
# maybe improved later
pieces
[
"error"
]
=
None
branch_name
,
rc
=
runner
(
GITS
,
[
"rev-parse"
,
"--abbrev-ref"
,
"HEAD"
],
cwd
=
root
)
branch_name
,
rc
=
runner
(
GITS
,
[
"rev-parse"
,
"--abbrev-ref"
,
"HEAD"
],
cwd
=
root
)
# --abbrev-ref was added in git-1.6.3
if
rc
!=
0
or
branch_name
is
None
:
raise
NotThisMethod
(
"'git rev-parse --abbrev-ref' returned error"
)
...
...
@@ -333,16 +316,17 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
dirty
=
git_describe
.
endswith
(
"-dirty"
)
pieces
[
"dirty"
]
=
dirty
if
dirty
:
git_describe
=
git_describe
[:
git_describe
.
rindex
(
"-dirty"
)]
git_describe
=
git_describe
[:
git_describe
.
rindex
(
"-dirty"
)]
# now we have TAG-NUM-gHEX or HEX
if
"-"
in
git_describe
:
# TAG-NUM-gHEX
mo
=
re
.
search
(
r
"^(.+)-(\d+)-g([0-9a-f]+)$"
,
git_describe
)
mo
=
re
.
search
(
r
'^(.+)-(\d+)-g([0-9a-f]+)$'
,
git_describe
)
if
not
mo
:
# unparsable. Maybe git-describe is misbehaving?
pieces
[
"error"
]
=
"unable to parse git-describe output: '
%
s'"
%
describe_out
pieces
[
"error"
]
=
(
"unable to parse git-describe output: '
%
s'"
%
describe_out
)
return
pieces
# tag
...
...
@@ -351,12 +335,10 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
if
verbose
:
fmt
=
"tag '
%
s' doesn't start with prefix '
%
s'"
print
(
fmt
%
(
full_tag
,
tag_prefix
))
pieces
[
"error"
]
=
"tag '{}' doesn't start with prefix '{}'"
.
format
(
full_tag
,
tag_prefix
,
)
pieces
[
"error"
]
=
(
"tag '
%
s' doesn't start with prefix '
%
s'"
%
(
full_tag
,
tag_prefix
))
return
pieces
pieces
[
"closest-tag"
]
=
full_tag
[
len
(
tag_prefix
)
:]
pieces
[
"closest-tag"
]
=
full_tag
[
len
(
tag_prefix
):]
# distance: number of commits since tag
pieces
[
"distance"
]
=
int
(
mo
.
group
(
2
))
...
...
@@ -367,8 +349,8 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
else
:
# HEX: no tags
pieces
[
"closest-tag"
]
=
None
count_out
,
rc
=
runner
(
GITS
,
[
"rev-list"
,
"HEAD"
,
"--coun
t"
],
cwd
=
root
)
pieces
[
"distance"
]
=
int
(
count_out
)
# total number of commits
out
,
rc
=
runner
(
GITS
,
[
"rev-list"
,
"HEAD"
,
"--left-righ
t"
],
cwd
=
root
)
pieces
[
"distance"
]
=
len
(
out
.
split
()
)
# total number of commits
# commit date: see ISO-8601 comment in git_versions_from_keywords()
date
=
runner
(
GITS
,
[
"show"
,
"-s"
,
"--format=
%
ci"
,
"HEAD"
],
cwd
=
root
)[
0
]
.
strip
()
...
...
@@ -405,7 +387,8 @@ def render_pep440(pieces):
rendered
+=
".dirty"
else
:
# exception #1
rendered
=
"0+untagged.
%
d.g
%
s"
%
(
pieces
[
"distance"
],
pieces
[
"short"
])
rendered
=
"0+untagged.
%
d.g
%
s"
%
(
pieces
[
"distance"
],
pieces
[
"short"
])
if
pieces
[
"dirty"
]:
rendered
+=
".dirty"
return
rendered
...
...
@@ -434,7 +417,8 @@ def render_pep440_branch(pieces):
rendered
=
"0"
if
pieces
[
"branch"
]
!=
"master"
:
rendered
+=
".dev0"
rendered
+=
"+untagged.
%
d.g
%
s"
%
(
pieces
[
"distance"
],
pieces
[
"short"
])
rendered
+=
"+untagged.
%
d.g
%
s"
%
(
pieces
[
"distance"
],
pieces
[
"short"
])
if
pieces
[
"dirty"
]:
rendered
+=
".dirty"
return
rendered
...
...
@@ -595,13 +579,11 @@ def render_git_describe_long(pieces):
def
render
(
pieces
,
style
):
"""Render the given version pieces into the requested style."""
if
pieces
[
"error"
]:
return
{
"version"
:
"unknown"
,
return
{
"version"
:
"unknown"
,
"full-revisionid"
:
pieces
.
get
(
"long"
),
"dirty"
:
None
,
"error"
:
pieces
[
"error"
],
"date"
:
None
,
}
"date"
:
None
}
if
not
style
or
style
==
"default"
:
style
=
"pep440"
# the default
...
...
@@ -625,13 +607,9 @@ def render(pieces, style):
else
:
raise
ValueError
(
"unknown style '
%
s'"
%
style
)
return
{
"version"
:
rendered
,
"full-revisionid"
:
pieces
[
"long"
],
"dirty"
:
pieces
[
"dirty"
],
"error"
:
None
,
"date"
:
pieces
.
get
(
"date"
),
}
return
{
"version"
:
rendered
,
"full-revisionid"
:
pieces
[
"long"
],
"dirty"
:
pieces
[
"dirty"
],
"error"
:
None
,
"date"
:
pieces
.
get
(
"date"
)}
def
get_versions
():
...
...
@@ -645,7 +623,8 @@ def get_versions():
verbose
=
cfg
.
verbose
try
:
return
git_versions_from_keywords
(
get_keywords
(),
cfg
.
tag_prefix
,
verbose
)
return
git_versions_from_keywords
(
get_keywords
(),
cfg
.
tag_prefix
,
verbose
)
except
NotThisMethod
:
pass
...
...
@@ -654,16 +633,13 @@ def get_versions():
# versionfile_source is the relative path from the top of the source
# tree (where the .git directory might live) to this file. Invert
# this to find the root from __file__.
for
_
in
cfg
.
versionfile_source
.
split
(
"/"
):
for
_
in
cfg
.
versionfile_source
.
split
(
'/'
):
root
=
os
.
path
.
dirname
(
root
)
except
NameError
:
return
{
"version"
:
"0+unknown"
,
"full-revisionid"
:
None
,
return
{
"version"
:
"0+unknown"
,
"full-revisionid"
:
None
,
"dirty"
:
None
,
"error"
:
"unable to find root of source tree"
,
"date"
:
None
,
}
"date"
:
None
}
try
:
pieces
=
git_pieces_from_vcs
(
cfg
.
tag_prefix
,
root
,
verbose
)
...
...
@@ -677,10 +653,6 @@ def get_versions():
except
NotThisMethod
:
pass
return
{
"version"
:
"0+unknown"
,
"full-revisionid"
:
None
,
return
{
"version"
:
"0+unknown"
,
"full-revisionid"
:
None
,
"dirty"
:
None
,
"error"
:
"unable to compute version"
,
"date"
:
None
,
}
"error"
:
"unable to compute version"
,
"date"
:
None
}
versioneer.py
浏览文件 @
824294dd
# Version: 0.23.dev0
# Version: 0.28
"""The Versioneer - like a rocketeer, but for versions.
...
...
@@ -8,12 +9,12 @@ The Versioneer
* like a rocketeer, but for versions!
* https://github.com/python-versioneer/python-versioneer
* Brian Warner
* License: Public Domain (
CC0-1.0
)
* License: Public Domain (
Unlicense
)
* Compatible with: Python 3.7, 3.8, 3.9, 3.10 and pypy3
* [![Latest Version][pypi-image]][pypi-url]
* [![Build Status][travis-image]][travis-url]
This is a tool for managing a recorded version number in
distutils/
setuptools-based
This is a tool for managing a recorded version number in setuptools-based
python projects. The goal is to remove the tedious and error-prone "update
the embedded version string" step from your release process. Making a new
release should be as easy as recording a new tag in your version-control
...
...
@@ -22,10 +23,38 @@ system, and maybe making new tarballs.
## Quick Install
Versioneer provides two installation modes. The "classic" vendored mode installs
a copy of versioneer into your repository. The experimental build-time dependency mode
is intended to allow you to skip this step and simplify the process of upgrading.
### Vendored mode
* `pip install versioneer` to somewhere in your $PATH
* A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is
available, so you can also use `conda install -c conda-forge versioneer`
* add a `[tool.versioneer]` section to your `pyproject.toml` or a
`[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md))
* Note that you will need to add `tomli; python_version < "3.11"` to your
build-time dependencies if you use `pyproject.toml`
* run `versioneer install --vendor` in your source tree, commit the results
* verify version information with `python setup.py version`
### Build-time dependency mode
* `pip install versioneer` to somewhere in your $PATH
* add a `[versioneer]` section to your setup.cfg (see [Install](INSTALL.md))
* run `versioneer install` in your source tree, commit the results
* Verify version information with `python setup.py version`
* A [conda-forge recipe](https://github.com/conda-forge/versioneer-feedstock) is
available, so you can also use `conda install -c conda-forge versioneer`
* add a `[tool.versioneer]` section to your `pyproject.toml` or a
`[versioneer]` section to your `setup.cfg` (see [Install](INSTALL.md))
* add `versioneer` (with `[toml]` extra, if configuring in `pyproject.toml`)
to the `requires` key of the `build-system` table in `pyproject.toml`:
```toml
[build-system]
requires = ["setuptools", "versioneer[toml]"]
build-backend = "setuptools.build_meta"
```
* run `versioneer install --no-vendor` in your source tree, commit the results
* verify version information with `python setup.py version`
## Version Identifiers
...
...
@@ -230,9 +259,10 @@ resolve it.
To upgrade your project to a new release of Versioneer, do the following:
* install the new Versioneer (`pip install -U versioneer` or equivalent)
* edit `setup.cfg`, if necessary, to include any new configuration settings
indicated by the release notes. See [UPGRADING](./UPGRADING.md) for details.
* re-run `versioneer install` in your source tree, to replace
* edit `setup.cfg` and `pyproject.toml`, if necessary,
to include any new configuration settings indicated by the release notes.
See [UPGRADING](./UPGRADING.md) for details.
* re-run `versioneer install --[no-]vendor` in your source tree, to replace
`SRC/_version.py`
* commit any changed files
...
...
@@ -262,9 +292,8 @@ number of intermediate scripts.
To make Versioneer easier to embed, all its code is dedicated to the public
domain. The `_version.py` that it creates is also in the public domain.
Specifically, both are released under the Creative Commons "Public Domain
Dedication" license (CC0-1.0), as described in
https://creativecommons.org/publicdomain/zero/1.0/ .
Specifically, both are released under the "Unlicense", as described in
https://unlicense.org/.
[pypi-image]: https://img.shields.io/pypi/v/versioneer.svg
[pypi-url]: https://pypi.python.org/pypi/versioneer/
...
...
@@ -286,9 +315,19 @@ import os
import
re
import
subprocess
import
sys
from
pathlib
import
Path
from
typing
import
Callable
,
Dict
import
functools
have_tomllib
=
True
if
sys
.
version_info
>=
(
3
,
11
):
import
tomllib
else
:
try
:
import
tomli
as
tomllib
except
ImportError
:
have_tomllib
=
False
class
VersioneerConfig
:
"""Container for Versioneer configuration parameters."""
...
...
@@ -325,7 +364,7 @@ def get_root():
my_path
=
os
.
path
.
realpath
(
os
.
path
.
abspath
(
__file__
))
me_dir
=
os
.
path
.
normcase
(
os
.
path
.
splitext
(
my_path
)[
0
])
vsr_dir
=
os
.
path
.
normcase
(
os
.
path
.
splitext
(
versioneer_py
)[
0
])
if
me_dir
!=
vsr_dir
:
if
me_dir
!=
vsr_dir
and
"VERSIONEER_PEP518"
not
in
globals
()
:
print
(
"Warning: build in
%
s is using versioneer.py from
%
s"
%
(
os
.
path
.
dirname
(
my_path
),
versioneer_py
))
except
NameError
:
...
...
@@ -339,22 +378,32 @@ def get_config_from_root(root):
# configparser.NoSectionError (if it lacks a [versioneer] section), or
# configparser.NoOptionError (if it lacks "VCS="). See the docstring at
# the top of versioneer.py for instructions on writing your setup.cfg .
setup_cfg
=
os
.
path
.
join
(
root
,
"setup.cfg"
)
root
=
Path
(
root
)
pyproject_toml
=
root
/
"pyproject.toml"
setup_cfg
=
root
/
"setup.cfg"
section
=
None
if
pyproject_toml
.
exists
()
and
have_tomllib
:
try
:
with
open
(
pyproject_toml
,
'rb'
)
as
fobj
:
pp
=
tomllib
.
load
(
fobj
)
section
=
pp
[
'tool'
][
'versioneer'
]
except
(
tomllib
.
TOMLDecodeError
,
KeyError
):
pass
if
not
section
:
parser
=
configparser
.
ConfigParser
()
with
open
(
setup_cfg
)
as
cfg_file
:
parser
.
read_file
(
cfg_file
)
VCS
=
parser
.
get
(
"versioneer"
,
"VCS"
)
# mandatory
parser
.
get
(
"versioneer"
,
"VCS"
)
# raise error if missing
# Dict-like interface for non-mandatory entries
section
=
parser
[
"versioneer"
]
cfg
=
VersioneerConfig
()
cfg
.
VCS
=
VCS
cfg
.
VCS
=
section
[
'VCS'
]
cfg
.
style
=
section
.
get
(
"style"
,
""
)
cfg
.
versionfile_source
=
section
.
get
(
"versionfile_source"
)
cfg
.
versionfile_build
=
section
.
get
(
"versionfile_build"
)
cfg
.
tag_prefix
=
section
.
get
(
"tag_prefix"
)
if
cfg
.
tag_prefix
in
(
"''"
,
'""'
):
if
cfg
.
tag_prefix
in
(
"''"
,
'""'
,
None
):
cfg
.
tag_prefix
=
""
cfg
.
parentdir_prefix
=
section
.
get
(
"parentdir_prefix"
)
cfg
.
verbose
=
section
.
get
(
"verbose"
)
...
...
@@ -411,7 +460,7 @@ def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
return
None
,
None
else
:
if
verbose
:
print
(
f
"unable to find command, tried {commands}"
)
print
(
"unable to find command, tried
%
s"
%
(
commands
,)
)
return
None
,
None
stdout
=
process
.
communicate
()[
0
]
.
strip
()
.
decode
()
if
process
.
returncode
!=
0
:
...
...
@@ -429,8 +478,9 @@ LONG_VERSION_PY['git'] = r'''
# directories (produced by setup.py build) will contain a much shorter file
# that just contains the computed version number.
# This file is released into the public domain. Generated by
# versioneer-0.23.dev0 (https://github.com/python-versioneer/python-versioneer)
# This file is released into the public domain.
# Generated by versioneer-0.28
# https://github.com/python-versioneer/python-versioneer
"""Git implementation of _version.py."""
...
...
@@ -672,19 +722,18 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
runner = functools.partial(runner, env=env)
_, rc = runner(GITS, ["rev-parse", "--git-dir"], cwd=root,
hide_stderr=
Tru
e)
hide_stderr=
not verbos
e)
if rc != 0:
if verbose:
print("Directory
%%
s not under git control"
%%
root)
raise NotThisMethod("'git rev-parse --git-dir' returned error")
MATCH_ARGS = ["--match", "
%%
s*"
%%
tag_prefix] if tag_prefix else []
# if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
# if there isn't one, this yields HEX[-dirty] (no NUM)
describe_out, rc = runner(GITS, ["describe", "--tags", "--dirty",
"--always", "--long", *MATCH_ARGS],
cwd=root)
describe_out, rc = runner(GITS, [
"describe", "--tags", "--dirty", "--always", "--long",
"--match", f"{tag_prefix}[[:digit:]]*"
], cwd=root)
# --long was added in git-1.5.5
if describe_out is None:
raise NotThisMethod("'git describe' failed")
...
...
@@ -773,8 +822,8 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
else:
# HEX: no tags
pieces["closest-tag"] = None
count_out, rc = runner(GITS, ["rev-list", "HEAD", "--coun
t"], cwd=root)
pieces["distance"] =
int(count_out
) # total number of commits
out, rc = runner(GITS, ["rev-list", "HEAD", "--left-righ
t"], cwd=root)
pieces["distance"] =
len(out.split()
) # total number of commits
# commit date: see ISO-8601 comment in git_versions_from_keywords()
date = runner(GITS, ["show", "-s", "--format=
%%
ci", "HEAD"], cwd=root)[0].strip()
...
...
@@ -870,7 +919,7 @@ def render_pep440_pre(pieces):
tag_version, post_version = pep440_split_post(pieces["closest-tag"])
rendered = tag_version
if post_version is not None:
rendered += ".post
%%
d.dev
%%
d"
%%
(post_version
+
1, pieces["distance"])
rendered += ".post
%%
d.dev
%%
d"
%%
(post_version
+
1, pieces["distance"])
else:
rendered += ".post0.dev
%%
d"
%%
(pieces["distance"])
else:
...
...
@@ -1092,7 +1141,7 @@ def git_get_keywords(versionfile_abs):
# _version.py.
keywords
=
{}
try
:
with
open
(
versionfile_abs
)
as
fobj
:
with
open
(
versionfile_abs
,
"r"
)
as
fobj
:
for
line
in
fobj
:
if
line
.
strip
()
.
startswith
(
"git_refnames ="
):
mo
=
re
.
search
(
r'=\s*"(.*)"'
,
line
)
...
...
@@ -1195,19 +1244,18 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
runner
=
functools
.
partial
(
runner
,
env
=
env
)
_
,
rc
=
runner
(
GITS
,
[
"rev-parse"
,
"--git-dir"
],
cwd
=
root
,
hide_stderr
=
Tru
e
)
hide_stderr
=
not
verbos
e
)
if
rc
!=
0
:
if
verbose
:
print
(
"Directory
%
s not under git control"
%
root
)
raise
NotThisMethod
(
"'git rev-parse --git-dir' returned error"
)
MATCH_ARGS
=
[
"--match"
,
"
%
s*"
%
tag_prefix
]
if
tag_prefix
else
[]
# if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
# if there isn't one, this yields HEX[-dirty] (no NUM)
describe_out
,
rc
=
runner
(
GITS
,
[
"describe"
,
"--tags"
,
"--dirty"
,
"--always"
,
"--long"
,
*
MATCH_ARGS
],
cwd
=
root
)
describe_out
,
rc
=
runner
(
GITS
,
[
"describe"
,
"--tags"
,
"--dirty"
,
"--always"
,
"--long"
,
"--match"
,
f
"{tag_prefix}[[:digit:]]*"
],
cwd
=
root
)
# --long was added in git-1.5.5
if
describe_out
is
None
:
raise
NotThisMethod
(
"'git describe' failed"
)
...
...
@@ -1296,8 +1344,8 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
else
:
# HEX: no tags
pieces
[
"closest-tag"
]
=
None
count_out
,
rc
=
runner
(
GITS
,
[
"rev-list"
,
"HEAD"
,
"--coun
t"
],
cwd
=
root
)
pieces
[
"distance"
]
=
int
(
count_out
)
# total number of commits
out
,
rc
=
runner
(
GITS
,
[
"rev-list"
,
"HEAD"
,
"--left-righ
t"
],
cwd
=
root
)
pieces
[
"distance"
]
=
len
(
out
.
split
()
)
# total number of commits
# commit date: see ISO-8601 comment in git_versions_from_keywords()
date
=
runner
(
GITS
,
[
"show"
,
"-s"
,
"--format=
%
ci"
,
"HEAD"
],
cwd
=
root
)[
0
]
.
strip
()
...
...
@@ -1309,7 +1357,7 @@ def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command):
return
pieces
def
do_vcs_install
(
manifest_in
,
versionfile_source
,
ipy
):
def
do_vcs_install
(
versionfile_source
,
ipy
):
"""Git-specific installation logic for Versioneer.
For Git, this means creating/changing .gitattributes to mark _version.py
...
...
@@ -1318,12 +1366,13 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
GITS
=
[
"git"
]
if
sys
.
platform
==
"win32"
:
GITS
=
[
"git.cmd"
,
"git.exe"
]
files
=
[
manifest_in
,
versionfile_source
]
files
=
[
versionfile_source
]
if
ipy
:
files
.
append
(
ipy
)
if
"VERSIONEER_PEP518"
not
in
globals
():
try
:
my_path
=
__file__
if
my_path
.
endswith
(
".pyc"
)
or
my_path
.
endswith
(
".pyo"
):
if
my_path
.
endswith
((
".pyc"
,
".pyo"
)
):
my_path
=
os
.
path
.
splitext
(
my_path
)[
0
]
+
".py"
versioneer_file
=
os
.
path
.
relpath
(
my_path
)
except
NameError
:
...
...
@@ -1331,7 +1380,7 @@ def do_vcs_install(manifest_in, versionfile_source, ipy):
files
.
append
(
versioneer_file
)
present
=
False
try
:
with
open
(
".gitattributes"
)
as
fobj
:
with
open
(
".gitattributes"
,
"r"
)
as
fobj
:
for
line
in
fobj
:
if
line
.
strip
()
.
startswith
(
versionfile_source
):
if
"export-subst"
in
line
.
strip
()
.
split
()[
1
:]:
...
...
@@ -1371,7 +1420,7 @@ def versions_from_parentdir(parentdir_prefix, root, verbose):
SHORT_VERSION_PY
=
"""
# This file was generated by 'versioneer.py' (0.2
3.dev0
) from
# This file was generated by 'versioneer.py' (0.2
8
) from
# revision-control system data, or from the parent directory name of an
# unpacked source archive. Distribution tarballs contain a pre-generated copy
# of this file.
...
...
@@ -1413,7 +1462,7 @@ def write_to_version_file(filename, versions):
with
open
(
filename
,
"w"
)
as
f
:
f
.
write
(
SHORT_VERSION_PY
%
contents
)
print
(
"set
{} to '{}'"
.
format
(
filename
,
versions
[
"version"
]))
print
(
"set
%
s to '
%
s'"
%
(
filename
,
versions
[
"version"
]))
def
plus_or_dot
(
pieces
):
...
...
@@ -1500,7 +1549,7 @@ def render_pep440_pre(pieces):
tag_version
,
post_version
=
pep440_split_post
(
pieces
[
"closest-tag"
])
rendered
=
tag_version
if
post_version
is
not
None
:
rendered
+=
".post
%
d.dev
%
d"
%
(
post_version
+
1
,
pieces
[
"distance"
])
rendered
+=
".post
%
d.dev
%
d"
%
(
post_version
+
1
,
pieces
[
"distance"
])
else
:
rendered
+=
".post0.dev
%
d"
%
(
pieces
[
"distance"
])
else
:
...
...
@@ -1713,7 +1762,7 @@ def get_versions(verbose=False):
try
:
ver
=
versions_from_file
(
versionfile_abs
)
if
verbose
:
print
(
f
"got version from file {versionfile_abs} {ver}"
)
print
(
"got version from file
%
s
%
s"
%
(
versionfile_abs
,
ver
)
)
return
ver
except
NotThisMethod
:
pass
...
...
@@ -1813,6 +1862,9 @@ def get_cmdclass(cmdclass=None):
# then does setup.py bdist_wheel, or sometimes setup.py install
# setup.py egg_info -> ?
# pip install -e . and setuptool/editable_wheel will invoke build_py
# but the build_py command is not expected to copy any files.
# we override different "build_py" commands for both environments
if
'build_py'
in
cmds
:
_build_py
=
cmds
[
'build_py'
]
...
...
@@ -1825,6 +1877,10 @@ def get_cmdclass(cmdclass=None):
cfg
=
get_config_from_root
(
root
)
versions
=
get_versions
()
_build_py
.
run
(
self
)
if
getattr
(
self
,
"editable_mode"
,
False
):
# During editable installs `.py` and data files are
# not copied to build_lib
return
# now locate _version.py in the new build/ directory and replace
# it with an updated value
if
cfg
.
versionfile_build
:
...
...
@@ -1853,6 +1909,8 @@ def get_cmdclass(cmdclass=None):
return
# now locate _version.py in the new build/ directory and replace
# it with an updated value
if
not
cfg
.
versionfile_build
:
return
target_versionfile
=
os
.
path
.
join
(
self
.
build_lib
,
cfg
.
versionfile_build
)
if
not
os
.
path
.
exists
(
target_versionfile
):
...
...
@@ -1897,6 +1955,9 @@ def get_cmdclass(cmdclass=None):
del
cmds
[
"build_py"
]
if
'py2exe'
in
sys
.
modules
:
# py2exe enabled?
try
:
from
py2exe.setuptools_buildexe
import
py2exe
as
_py2exe
except
ImportError
:
from
py2exe.distutils_buildexe
import
py2exe
as
_py2exe
class
cmd_py2exe
(
_py2exe
):
...
...
@@ -1921,6 +1982,43 @@ def get_cmdclass(cmdclass=None):
})
cmds
[
"py2exe"
]
=
cmd_py2exe
# sdist farms its file list building out to egg_info
if
'egg_info'
in
cmds
:
_egg_info
=
cmds
[
'egg_info'
]
else
:
from
setuptools.command.egg_info
import
egg_info
as
_egg_info
class
cmd_egg_info
(
_egg_info
):
def
find_sources
(
self
):
# egg_info.find_sources builds the manifest list and writes it
# in one shot
super
()
.
find_sources
()
# Modify the filelist and normalize it
root
=
get_root
()
cfg
=
get_config_from_root
(
root
)
self
.
filelist
.
append
(
'versioneer.py'
)
if
cfg
.
versionfile_source
:
# There are rare cases where versionfile_source might not be
# included by default, so we must be explicit
self
.
filelist
.
append
(
cfg
.
versionfile_source
)
self
.
filelist
.
sort
()
self
.
filelist
.
remove_duplicates
()
# The write method is hidden in the manifest_maker instance that
# generated the filelist and was thrown away
# We will instead replicate their final normalization (to unicode,
# and POSIX-style paths)
from
setuptools
import
unicode_utils
normalized
=
[
unicode_utils
.
filesys_decode
(
f
)
.
replace
(
os
.
sep
,
'/'
)
for
f
in
self
.
filelist
.
files
]
manifest_filename
=
os
.
path
.
join
(
self
.
egg_info
,
'SOURCES.txt'
)
with
open
(
manifest_filename
,
'w'
)
as
fobj
:
fobj
.
write
(
'
\n
'
.
join
(
normalized
))
cmds
[
'egg_info'
]
=
cmd_egg_info
# we override different "sdist" commands for both environments
if
'sdist'
in
cmds
:
_sdist
=
cmds
[
'sdist'
]
...
...
@@ -2030,7 +2128,7 @@ def do_setup():
"__init__.py"
)
if
os
.
path
.
exists
(
ipy
):
try
:
with
open
(
ipy
)
as
f
:
with
open
(
ipy
,
"r"
)
as
f
:
old
=
f
.
read
()
except
OSError
:
old
=
""
...
...
@@ -2050,42 +2148,10 @@ def do_setup():
print
(
"
%
s doesn't exist, ok"
%
ipy
)
ipy
=
None
# Make sure both the top-level "versioneer.py" and versionfile_source
# (PKG/_version.py, used by runtime code) are in MANIFEST.in, so
# they'll be copied into source distributions. Pip won't be able to
# install the package without this.
manifest_in
=
os
.
path
.
join
(
root
,
"MANIFEST.in"
)
simple_includes
=
set
()
try
:
with
open
(
manifest_in
)
as
f
:
for
line
in
f
:
if
line
.
startswith
(
"include "
):
for
include
in
line
.
split
()[
1
:]:
simple_includes
.
add
(
include
)
except
OSError
:
pass
# That doesn't cover everything MANIFEST.in can do
# (https://packaging.python.org/en/latest/guides/using-manifest-in/#manifest-in-commands),
# so it might give some false negatives. Appending redundant 'include'
# lines is safe, though.
if
"versioneer.py"
not
in
simple_includes
:
print
(
" appending 'versioneer.py' to MANIFEST.in"
)
with
open
(
manifest_in
,
"a"
)
as
f
:
f
.
write
(
"include versioneer.py
\n
"
)
else
:
print
(
" 'versioneer.py' already in MANIFEST.in"
)
if
cfg
.
versionfile_source
not
in
simple_includes
:
print
(
" appending versionfile_source ('
%
s') to MANIFEST.in"
%
cfg
.
versionfile_source
)
with
open
(
manifest_in
,
"a"
)
as
f
:
f
.
write
(
"include
%
s
\n
"
%
cfg
.
versionfile_source
)
else
:
print
(
" versionfile_source already in MANIFEST.in"
)
# Make VCS-specific changes. For git, this means creating/changing
# .gitattributes to mark _version.py for export-subst keyword
# substitution.
do_vcs_install
(
manifest_in
,
cfg
.
versionfile_source
,
ipy
)
do_vcs_install
(
cfg
.
versionfile_source
,
ipy
)
return
0
...
...
@@ -2094,7 +2160,7 @@ def scan_setup_py():
found
=
set
()
setters
=
False
errors
=
0
with
open
(
"setup.py"
)
as
f
:
with
open
(
"setup.py"
,
"r"
)
as
f
:
for
line
in
f
.
readlines
():
if
"import versioneer"
in
line
:
found
.
add
(
"import"
)
...
...
@@ -2126,10 +2192,14 @@ def scan_setup_py():
return
errors
def
setup_command
():
"""Set up Versioneer and exit with appropriate error code."""
errors
=
do_setup
()
errors
+=
scan_setup_py
()
sys
.
exit
(
1
if
errors
else
0
)
if
__name__
==
"__main__"
:
cmd
=
sys
.
argv
[
1
]
if
cmd
==
"setup"
:
errors
=
do_setup
()
errors
+=
scan_setup_py
()
if
errors
:
sys
.
exit
(
1
)
setup_command
()
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论