gocheese.texi | 10 +++++++--- pyshop2packages.sh | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/gocheese.texi b/gocheese.texi index ca2b21a59d4dd67fcfe7718176877315b8ba0471d9c269dd63ca15780c2e3cb4..f16587b34497297e2d288c2ad577d6487d8d1869925a3face0ec30e0eb4dbffa 100644 --- a/gocheese.texi +++ b/gocheese.texi @@ -10,9 +10,9 @@ It serves two purposes: @itemize -@item hosting of private locally uploaded packages (conforming to - @url{https://www.python.org/dev/peps/pep-0503/, PEP-0503} (Simple - Repository API)) +@item hosting of private locally uploaded packages + (conforming to @url{https://www.python.org/dev/peps/pep-0503/, PEP-0503} + (Simple Repository API)) @item proxying and caching of missing packages from upstream @url{https://pypi.org/, PyPI} @end itemize @@ -29,6 +29,10 @@ @item graceful HTTP-server shutdown @item no YAML configuration, just command-line arguments @item no package overwriting ability (as PyPI does) @end itemize + +Also it contains @file{pyshop2packages.sh} migration script for +converting @url{https://pypi.org/project/pyshop/, Pyshop} database into +GoCheese one, including private packages. GoCheese is free software, licenced under @url{https://www.gnu.org/licenses/gpl-3.0.html, GNU GPLv3}: diff --git a/pyshop2packages.sh b/pyshop2packages.sh new file mode 100755 index 0000000000000000000000000000000000000000..6f81e8ec85efe2799355a1c14991a88b57f9bab6bb0201577f7374bab7e2b017 --- /dev/null +++ b/pyshop2packages.sh @@ -0,0 +1,57 @@ +#!/bin/sh -e +# Convert Pyshop working directory to GoCheese friendly one. +# Script expects to be run in packages repository (a/, b/, ...) +# with pyshop.db database file. It will create packages/ directory +# with all Pyshop-downloaded/uploaded files, SHA256 checksums, +# private package marks. Also it will call GoCheese's /simple/ API +# for forcing metainformation update (necessary for storing SHA256 +# checksums missing in Pyshop). + +pkgname() { + perl -ne "s/[-_.]+/-/g ; print lc" +} + +######################################################################## +# Copy all already existing files +######################################################################## +ctr=0 +echo " +SELECT package.name, release_file.filename +FROM release_file +JOIN release ON release.id = release_file.release_id +JOIN package ON release.package_id = package.id +ORDER BY package.name +" | sqlite3 --separator " " pyshop.db | while read pkginfo ; do + ctr=$(( $ctr + 1 )) + [ $(( $ctr % 100 )) -ne 0 ] || echo $ctr $pkginfo + pkg=$(echo "$pkginfo" | cut -f1 | pkgname) + filename=$(echo "$pkginfo" | cut -f2) + [ -n "$pkg" ] + [ -n "$filename" ] + src=$(echo $pkg | cut -c1)/$filename + dst=packages/$pkg/$filename + [ -r $src ] || continue + [ -r $dst ] && continue || : + mkdir -p packages/$pkg + tee $dst < $src | sha256 | xxd -r -p > $dst.sha256 +done + +######################################################################## +# Mark all private packages +######################################################################## +for pkg in $(echo "SELECT name FROM package WHERE local = true" | sqlite3 pyshop.db); do + touch packages/$(echo $pkg | pkgname)/.private +done + +######################################################################## +# Force all metainformation update from upstream +######################################################################## +cd packages +for pkg in * ; do + curl http://localhost:8080/simple/$pkg/ > /dev/null +done + +######################################################################## +# Assure ckecksums are good +######################################################################## +gocheese -fsck