mirror of
https://github.com/lilydjwg/nvchecker.git
synced 2025-03-10 06:14:02 +00:00
add vcs version checker
This commit is contained in:
parent
f85909e6ee
commit
ff7f3c65f9
4 changed files with 158 additions and 1 deletions
|
@ -4,7 +4,7 @@ from importlib import import_module
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
handler_precedence = (
|
handler_precedence = (
|
||||||
'github', 'aur', 'pypi', 'archpkg', 'gems', 'pacman',
|
'github', 'aur', 'pypi', 'archpkg', 'gems', 'pacman',
|
||||||
'cmd', 'gcode_hg', 'regex', 'manual',
|
'cmd', 'gcode_hg', 'regex', 'manual', 'vcs'
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_version(name, conf, callback):
|
def get_version(name, conf, callback):
|
||||||
|
|
50
nvchecker/source/vcs.py
Normal file
50
nvchecker/source/vcs.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
import logging
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
|
import tornado.process
|
||||||
|
from tornado.ioloop import IOLoop
|
||||||
|
|
||||||
|
import os.path as _path
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
_self_path = _path.dirname(_path.abspath(__file__))
|
||||||
|
_cmd_prefix=['/bin/bash', _path.join(_self_path, 'vcs.sh')]
|
||||||
|
|
||||||
|
PROT_VER = 1
|
||||||
|
|
||||||
|
def _parse_oldver(oldver):
|
||||||
|
if oldver is None:
|
||||||
|
return (PROT_VER, 0, '')
|
||||||
|
try:
|
||||||
|
prot_ver, count, ver = oldver.split('.', maxsplit=2)
|
||||||
|
prot_ver = int(prot_ver)
|
||||||
|
count = int(count)
|
||||||
|
except:
|
||||||
|
return (PROT_VER, 0, '')
|
||||||
|
if prot_ver != PROT_VER:
|
||||||
|
return (PROT_VER, 0, ver)
|
||||||
|
return (PROT_VER, count, ver)
|
||||||
|
|
||||||
|
def get_version(name, conf, callback):
|
||||||
|
vcs = conf['vcs']
|
||||||
|
oldver = conf['oldver']
|
||||||
|
cmd = _cmd_prefix + [name, vcs]
|
||||||
|
p = tornado.process.Subprocess(cmd, io_loop=IOLoop.instance(),
|
||||||
|
stdout=tornado.process.Subprocess.STREAM)
|
||||||
|
p.set_exit_callback(partial(_command_done, name, oldver, callback, p))
|
||||||
|
|
||||||
|
def _command_done(name, oldver, callback, process, status):
|
||||||
|
if status != 0:
|
||||||
|
logger.error('%s: command exited with %d.', name, status)
|
||||||
|
callback(name, None)
|
||||||
|
else:
|
||||||
|
process.stdout.read_until_close(partial(_got_version_from_cmd,
|
||||||
|
callback, name, oldver))
|
||||||
|
|
||||||
|
def _got_version_from_cmd(callback, name, oldver_str, output):
|
||||||
|
output = output.strip().decode('latin1')
|
||||||
|
oldver = _parse_oldver(oldver_str)
|
||||||
|
if output == oldver[2]:
|
||||||
|
callback(name, None)
|
||||||
|
else:
|
||||||
|
callback(name, "%d.%d.%s" % (oldver[0], oldver[1] + 1, output))
|
106
nvchecker/source/vcs.sh
Normal file
106
nvchecker/source/vcs.sh
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
exec 3>&1
|
||||||
|
exec >&2
|
||||||
|
|
||||||
|
dir=$1
|
||||||
|
vcs=$2
|
||||||
|
|
||||||
|
parse_vcs_url() {
|
||||||
|
local _url=$1
|
||||||
|
local _out_var=$2
|
||||||
|
# remove folder::
|
||||||
|
[[ $_url =~ ^[^/:]*::(.*)$ ]] && _url=${BASH_REMATCH[1]}
|
||||||
|
[[ $_url =~ ^(bzr|git|hg|svn)([+:])(.*) ]] || return 1
|
||||||
|
local _proto=${BASH_REMATCH[1]}
|
||||||
|
[[ ${BASH_REMATCH[2]} = + ]] && _url=${BASH_REMATCH[3]}
|
||||||
|
local _real_url=${_url%\#*}
|
||||||
|
local _frag=''
|
||||||
|
[[ $_real_url = $_url ]] || _frag=${_url##*\#}
|
||||||
|
eval "${_out_var}"'=("${_proto}" "${_real_url}" "${_frag}")'
|
||||||
|
}
|
||||||
|
|
||||||
|
get_vcs() {
|
||||||
|
local _vcs=$1
|
||||||
|
local _out_var=$2
|
||||||
|
if [[ -z $_vcs ]]; then
|
||||||
|
_vcs=$(. PKGBUILD &> /dev/null
|
||||||
|
for src in "${source[@]}"; do
|
||||||
|
parse_vcs_url "$src" _ && {
|
||||||
|
echo "$src"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
done
|
||||||
|
exit 1) || return 1
|
||||||
|
fi
|
||||||
|
parse_vcs_url "$_vcs" "$_out_var"
|
||||||
|
}
|
||||||
|
|
||||||
|
git_get_version() {
|
||||||
|
local _url=$1
|
||||||
|
local _frag=$2
|
||||||
|
local _ref=''
|
||||||
|
if [[ -z $_frag ]]; then
|
||||||
|
_ref=HEAD
|
||||||
|
elif [[ $_frag =~ ^commit=(.*)$ ]]; then
|
||||||
|
echo "${BASH_REMATCH[1]}"
|
||||||
|
return 0
|
||||||
|
elif [[ $_frag =~ ^branch=(.*)$ ]]; then
|
||||||
|
_ref=refs/heads/${BASH_REMATCH[1]}
|
||||||
|
elif [[ $_frag =~ ^tag=(.*)$ ]]; then
|
||||||
|
_ref=refs/tags/${BASH_REMATCH[1]}
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local _res=$(git ls-remote "$_url" "$_ref")
|
||||||
|
[[ $_res =~ ^([a-fA-F0-9]*)[[:blank:]] ]] || return 1
|
||||||
|
echo "${BASH_REMATCH[1]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
hg_get_version() {
|
||||||
|
local _url=$1
|
||||||
|
local _frag=$2
|
||||||
|
local _ref
|
||||||
|
if [[ -z $_frag ]]; then
|
||||||
|
_ref=default
|
||||||
|
elif [[ $_frag =~ ^(revision|tag|branch)=(.*)$ ]]; then
|
||||||
|
_ref=${BASH_REMATCH[2]}
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
hg identify "${_url}#${_ref}"
|
||||||
|
}
|
||||||
|
|
||||||
|
svn_get_version() {
|
||||||
|
local _url=$1
|
||||||
|
local _frag=$2
|
||||||
|
local _extra_arg=()
|
||||||
|
if [[ -z $_frag ]]; then
|
||||||
|
true
|
||||||
|
elif [[ $_frag =~ ^(revision)=(.*)$ ]]; then
|
||||||
|
_extra_arg=(-r "${BASH_REMATCH[2]}")
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# Get rid of locale
|
||||||
|
env -i PATH="${PATH}" svn info "${_extra_arg[@]}" "${_url}" | \
|
||||||
|
sed -n 's/^Revision:[[:blank:]]*\([0-9]*\)/\1/p'
|
||||||
|
}
|
||||||
|
|
||||||
|
bzr_get_version() {
|
||||||
|
local _url=$1
|
||||||
|
local _frag=$2
|
||||||
|
local _extra_arg=()
|
||||||
|
if [[ -z $_frag ]]; then
|
||||||
|
true
|
||||||
|
elif [[ $_frag =~ ^(revision)=(.*)$ ]]; then
|
||||||
|
_extra_arg=(-r "${BASH_REMATCH[2]}")
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
bzr revno -q "${_extra_arg[@]}" "${_url}"
|
||||||
|
}
|
||||||
|
|
||||||
|
cd "${dir}"
|
||||||
|
get_vcs "${vcs}" components || exit 1
|
||||||
|
eval "${components[0]}_get_version"' ${components[@]:1}' >&3
|
1
setup.py
1
setup.py
|
@ -16,6 +16,7 @@ setup(
|
||||||
'nvcmp = nvchecker.tools:cmp',
|
'nvcmp = nvchecker.tools:cmp',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
package_data={'nvchecker': ['source/vcs.sh']},
|
||||||
|
|
||||||
author = 'lilydjwg',
|
author = 'lilydjwg',
|
||||||
author_email = 'lilydjwg@gmail.com',
|
author_email = 'lilydjwg@gmail.com',
|
||||||
|
|
Loading…
Add table
Reference in a new issue