From 465cc8882f479c90ba7730ceb1273e4f6a4d3461 Mon Sep 17 00:00:00 2001 From: ed Date: Sat, 1 Jun 2019 15:55:21 +0000 Subject: [PATCH] port packaging from r0c --- scripts/make-pypi-release.bat | 5 + scripts/make-pypi-release.sh | 104 +++++++++++++++++ scripts/make-tgz-release.sh | 107 ++++++++++++++++++ setup.py | 203 ++++++++++++++++++++++++++++++++++ 4 files changed, 419 insertions(+) create mode 100644 scripts/make-pypi-release.bat create mode 100755 scripts/make-pypi-release.sh create mode 100755 scripts/make-tgz-release.sh create mode 100755 setup.py diff --git a/scripts/make-pypi-release.bat b/scripts/make-pypi-release.bat new file mode 100644 index 00000000..6a3041a5 --- /dev/null +++ b/scripts/make-pypi-release.bat @@ -0,0 +1,5 @@ +cd %~dp0\.. +python setup.py clean2 +python setup.py rstconv +python setup.py sdist bdist_wheel --universal +REM python setup.py sdist upload -r pypi diff --git a/scripts/make-pypi-release.sh b/scripts/make-pypi-release.sh new file mode 100755 index 00000000..bca7a0bf --- /dev/null +++ b/scripts/make-pypi-release.sh @@ -0,0 +1,104 @@ +#!/bin/bash +set -e +echo + +# osx support +sed=$( which gsed 2>/dev/null || which sed) +find=$(which gfind 2>/dev/null || which find) +sort=$(which gsort 2>/dev/null || which sort) + +which md5sum 2>/dev/null >/dev/null && + md5sum=md5sum || + md5sum="md5 -r" + +mode="$1" + +[[ "x$mode" == x ]] && +{ + echo "need argument 1: (D)ry or (U)pload" + echo + exit 1 +} + +[[ -e copyparty/__main__.py ]] || cd .. +[[ -e copyparty/__main__.py ]] || +{ + echo "run me from within the copyparty folder" + echo + exit 1 +} + + +# one-time stuff, do this manually through copy/paste +true || +{ + cat > ~/.pypirc < ~/Desktop/rst.html +} + + + +pydir="$( + which python | + sed -r 's@[^/]*$@@' +)" + +[[ -e "$pydir/activate" ]] && +{ + echo '`deactivate` your virtualenv' + exit 1 +} + +function have() { + python -c "import $1; $1; $1.__version__" +} + +. buildenv/bin/activate +have setuptools +have wheel +have m2r +./setup.py clean2 +./setup.py rstconv +./setup.py sdist bdist_wheel --universal +[[ "x$mode" == "xu" ]] && + ./setup.py sdist bdist_wheel upload -r pypi + +cat </dev/null || which sed) +find=$(which gfind 2>/dev/null || which find) +sort=$(which gsort 2>/dev/null || which sort) + +which md5sum 2>/dev/null >/dev/null && + md5sum=md5sum || + md5sum="md5 -r" + +ver="$1" + +[[ "x$ver" == x ]] && +{ + echo "need argument 1: version" + echo + exit 1 +} + +[[ -e copyparty/__main__.py ]] || cd .. +[[ -e copyparty/__main__.py ]] || +{ + echo "run me from within the copyparty folder" + echo + exit 1 +} + +out_dir="$(pwd | $sed -r 's@/[^/]+$@@')" +zip_path="$out_dir/copyparty-$ver.zip" +tgz_path="$out_dir/copyparty-$ver.tar.gz" + +[[ -e "$zip_path" ]] || +[[ -e "$tgz_path" ]] && +{ + echo "found existing archives for this version" + echo " $zip_path" + echo " $tgz_path" + echo + echo "continue?" + read -u1 +} +rm "$zip_path" 2>/dev/null || true +rm "$tgz_path" 2>/dev/null || true + +#$sed -ri "s/^(ADMIN_PWD *= *u).*/\1'hunter2'/" copyparty/config.py + +tmp="$(mktemp -d)" +rls_dir="$tmp/copyparty-$ver" +mkdir "$rls_dir" + +echo ">>> export" +git archive master | +tar -x -C "$rls_dir" + +cd "$rls_dir" +$find -type d -exec chmod 755 '{}' \+ +$find -type f -exec chmod 644 '{}' \+ + +commaver="$( + printf '%s\n' "$ver" | + sed -r 's/\./,/g' +)" + +grep -qE "^VERSION *= \(${commaver}\)$" copyparty/__version__.py || +{ + echo "$tmp" + echo "bad version" + echo + echo " arg: $commaver" + echo "code: $( + cat copyparty/__version__.py | + grep -E '^VERSION' + )" + echo + echo "continue?" + read -u1 +} + +rm -rf .vscode +rm \ + .gitattributes \ + .gitignore + +mv LICENSE LICENSE.txt + +# messy because osx support +$find -type f -exec $md5sum '{}' \+ | +$sed -r 's/(.{32})(.*)/\2\1/' | LC_COLLATE=c $sort | +$sed -r 's/(.*)(.{32})/\2\1/' | +$sed -r 's/^(.{32}) \./\1 ./' > ../.sums.md5 +mv ../.sums.md5 . + +cd .. +echo ">>> tar"; tar -czf "$tgz_path" "copyparty-$ver" +echo ">>> zip"; zip -qr "$zip_path" "copyparty-$ver" + +rm -rf "$tmp" +echo +echo "done:" +echo " $zip_path" +echo " $tgz_path" +echo + +# function alr() { ls -alR copyparty-$1 | $sed -r "s/copyparty-$1/copyparty/" | $sed -r 's/[A-Z][a-z]{2} [0-9 ]{2} [0-9]{2}:[0-9]{2}//' > $1; }; for x in master rls src ; do alr $x; done + diff --git a/setup.py b/setup.py new file mode 100755 index 00000000..fcfb660a --- /dev/null +++ b/setup.py @@ -0,0 +1,203 @@ +#!/usr/bin/env python +# coding: utf-8 +from __future__ import print_function + +import io +import os +import sys +from glob import glob +from shutil import rmtree + +setuptools_available = True +try: + # need setuptools to build wheel + from setuptools import setup, Command + +except ImportError: + # works in a pinch + setuptools_available = False + from distutils.core import setup, Command + +from distutils.spawn import spawn + +if "bdist_wheel" in sys.argv and not setuptools_available: + print("cannot build wheel without setuptools") + sys.exit(1) + + +def mglob(dirname, extensions): + ret = [] + for ext in extensions: + ret.extend(glob(dirname + "/*." + ext)) + return ret + + +NAME = "copyparty" +VERSION = None +data_files = [("share/doc/copyparty", ["README.rst", "README.md", "LICENSE"])] +manifest = "" +for dontcare, files in data_files: + # print(dontcare) + for fn in files: + manifest += "include {0}\n".format(fn) + +here = os.path.abspath(os.path.dirname(__file__)) + +with open(here + "/MANIFEST.in", "wb") as f: + f.write(manifest.encode("utf-8")) + + +try: + LONG_DESCRIPTION = "" + LDCT = "" + with open(here + "/README.rst", "rb") as f: + txt = f.read().decode("utf-8") + txt = txt[txt.find("`") :] + LONG_DESCRIPTION = txt + LDCT = "text/x-rst" +except: + print("\n### could not open README.rst ###\n") + with open(here + "/README.md", "rb") as f: + txt = f.read().decode("utf-8") + LONG_DESCRIPTION = txt + LDCT = "text/markdown" + + +about = {} +if not VERSION: + with open(os.path.join(here, NAME, "__version__.py"), "rb") as f: + exec(f.read().decode("utf-8").split("\n\n", 1)[1], about) +else: + about["__version__"] = VERSION + + +class clean2(Command): + description = "Cleans the source tree" + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + os.system("{0} setup.py clean --all".format(sys.executable)) + + try: + rmtree("./dist") + except: + pass + + try: + rmtree("./copyparty.egg-info") + except: + pass + + nuke = [] + for (dirpath, dirnames, filenames) in os.walk("."): + for fn in filenames: + if ( + fn.endswith(".rst") + or fn.endswith(".pyc") + or fn.endswith(".pyo") + or fn.endswith(".pyd") + or fn.startswith("MANIFEST") + ): + nuke.append(dirpath + "/" + fn) + + for fn in nuke: + os.unlink(fn) + + +class rstconv(Command): + description = "Converts markdown to rst" + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + self.proc_dir(".") + self.proc_dir("docs") + + def proc_dir(self, path): + import m2r + + for (dirpath, dirnames, filenames) in os.walk(path): + + dirnames.sort() + for fn in sorted(filenames): + + fn = dirpath + "/" + fn + if not fn.endswith(".md"): + continue + + rst_fn = fn[:-3] + ".rst" + with open(fn, "rb") as f: + md = f.read().decode("utf-8") + + md = md.replace("* **[", "* [").replace(")** <-", ") <-") + rst = m2r.convert(md) + rst = rst.replace(":raw-html-m2r:`", ":sub:`") + rst = rst.replace("`", "`") + + with open(rst_fn, "wb") as f: + f.write(rst.encode("utf-8")) + + +args = { + "name": NAME, + "version": about["__version__"], + "description": "http file sharing hub", + "long_description": LONG_DESCRIPTION, + "long_description_content_type": LDCT, + "author": "ed", + "author_email": "copyparty@ocv.me", + "url": "https://github.com/9001/copyparty", + "license": "MIT", + "data_files": data_files, + "classifiers": [ + "Development Status :: 5 - Production/Stable", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", + "Environment :: Console", + "Topic :: Communications :: Chat", + ], + "cmdclass": {"rstconv": rstconv, "clean2": clean2}, +} + + +if setuptools_available: + args.update( + { + "install_requires": [], + "include_package_data": True, + "packages": ["copyparty"], + "entry_points": { + "console_scripts": ["copyparty = copyparty.__main__:main"] + }, + } + ) +else: + args.update({"packages": ["copyparty"], "scripts": ["bin/copyparty"]}) + + +# import pprint +# pprint.PrettyPrinter().pprint(args) +# sys.exit(0) + +setup(**args)