cygport improvements: upload, fish, src_prep_fini_hook

Yaakov Selkowitz yselkowitz@cygwin.com
Wed Dec 3 18:50:00 GMT 2014


On 2014-10-27 04:10, Andrew Schulman wrote:
>> On 2014-10-19 09:13, Andrew Schulman wrote:
>>> I've published several improvements to cygport on Github.  Each improvement
>>> is in its own branch:
>>>
>>> upload
>>>     Adds the "upload" command: upload finished packages to cygwin.com.
>>
>> I definitely want to add this feature.  However, the implementation is
>> overly complicated; only one upload client need be supported, which
>> should then be added to requires:.  (Yes, I'm aware that downloading
>> handles wget or curl, but that is legacy code and the same should apply
>> there.)  The pkg_name for loops are also incorrect wrt subpackages.
>
> Both fixed in the upload branch.

Here's what I have at the moment based on your branch as of a few weeks 
ago.  However, with password-protected SSH keys, the password prompt 
isn't handled properly.  Any ideas?
-------------- next part --------------
diff --git a/README b/README
index 800dceb..afcfca1 100644
--- a/README
+++ b/README
@@ -144,6 +144,7 @@ to be processed.  All other arguments are interpreted as a COMMAND, which may be
     test      - run the package's test suite, if one exists
     install   - install into a DESTDIR, and run post-installation steps
     package   - create binary and source packages
+    upload    - upload finished packages to cygwin.com
     finish    - delete the working directory
     all       - run all of the above, including finish
     almostall - run all of the above, except for finish
@@ -197,6 +198,7 @@ addition to the packages own dependencies:
     gawk
     grep
     gzip
+    lftp
     libtool
     lndir
     make
diff --git a/bin/cygport.in b/bin/cygport.in
index 0b26444..e14b22a 100755
--- a/bin/cygport.in
+++ b/bin/cygport.in
@@ -99,6 +99,7 @@ source ${_privlibdir}/syntax.cygpart
 #  * Installing
 #  * Postinstall
 #  * Packaging
+#  * Uploading
 #  * Cygclasses
 #****
 
@@ -108,8 +109,8 @@ source ${_privlibdir}/syntax.cygpart
 #  REQUIRES
 #  The following packages are required to build packages with cygport:
 #   autoconf, automake, bash, binutils, bzip2, coreutils, diffstat, diffutils,
-#   dos2unix, file, gawk, grep, gzip, libtool, lndir, make, patch, rsync, sed,
-#   tar, unzip, util-linux, wget, which, xz.
+#   dos2unix, file, gawk, grep, gzip, lftp, libtool, lndir, make, patch, rsync,
+#   sed, tar, unzip, util-linux, wget, which, xz.
 #  Other software packages are required by some Cygclasses, as indicated within.
 #****
 
@@ -293,6 +294,27 @@ unset conf;
 #  section.
 #****
 
+#****** Cygport/Uploading
+#  INTRODUCTION
+#  Once your binary and source packages are built, in order to distribute them
+#  to users, you need to upload them to the Cygwin package archive.  Before
+#  you can upload packages, you'll need to do the following things:
+#  * Request upload privileges, and provide your ssh public key.  The
+#    |html <a href="https://sourceware.org/cygwin-apps/package-upload.html">Uploading Packages</a>
+#    page tells how to do that, and how to be notified in case of problems with
+#    your uploads.
+#  * Be listed on the
+#    |html <a href="https://cygwin.com/cygwin-pkg-maint">Cygwin package maintainers list</a>
+#    as the maintainer of your packages.  Ask on the cygwin-apps mailing list if
+#    you need help getting listed.
+#
+#  Once those things are done, running
+#  |html <tt>cygport upload</tt> (or <tt>cygport up</tt> for short)
+#  will upload your finished packages to the package archive on cygwin.com.
+#  From there, if everything goes well, the new files should appear on your
+#  local Cygwin mirror within about 12 hours.
+#****
+
 #****** Cygport/Cygclasses
 #  DESCRIPTION
 #  Cygclasses serve as cygport's standard library, allowing cygport to support
@@ -518,6 +540,10 @@ source ${_privlibdir}/pkg_info.cygpart
 source ${_privlibdir}/pkg_pkg.cygpart
 ###
 
+### __pkg_upload
+source ${_privlibdir}/pkg_upload.cygpart
+###
+
 ### __finish
 source ${_privlibdir}/pkg_cleanup.cygpart
 ###
@@ -737,6 +763,7 @@ declare -r compilelog="${logdir}/${PF}-compile.log";
 declare -r checklog="${logdir}/${PF}-check.log";
 declare -r installlog="${logdir}/${PF}-install.log";
 declare -r pkglog="${logdir}/${PF}-pkg.log";
+declare -r uploadlog="${logdir}/${PF}-upload.log";
 
 if ! defined SRC_URI
 then
@@ -860,6 +887,12 @@ do
 			__pkg_diff;
 			_status=$?;
 			;;
+		upload|up)
+			__stage Uploading;
+			__log_init ${uploadlog};
+			(__pkg_upload) 2>&1 | tee -a ${uploadlog};
+			_status=$?;
+			;;
 		clean|finish)
 			__finish;
 			_status=$?;
diff --git a/cygport.spec b/cygport.spec
index d0dcbf7..7a81b4b 100644
--- a/cygport.spec
+++ b/cygport.spec
@@ -28,6 +28,7 @@ Requires:       file
 Requires:       gawk
 Requires:       grep
 Requires:       imake
+Requires:       lftp
 Requires:       make
 Requires:       patch
 Requires:       rsync
diff --git a/data/cygport-bash-completion b/data/cygport-bash-completion
index 639f873..18a5adf 100644
--- a/data/cygport-bash-completion
+++ b/data/cygport-bash-completion
@@ -11,7 +11,7 @@ _cygport()
 		prep unpack oldpatch compile build make \
 		check test inst install list dep depends \
 		info package pkg diff mkdiff mkpatch clean finish \
-		almostall all help version homepage website'
+		upload up almostall all help version homepage website'
 
 	if [[ $COMP_CWORD -eq 1 ]] ; then
 		# first arg: source file completion
diff --git a/data/cygport.conf b/data/cygport.conf
index 87a5312..be859c8 100644
--- a/data/cygport.conf
+++ b/data/cygport.conf
@@ -66,6 +66,12 @@
 #****
 #PAGER=
 
+#****v* Configuration/SSH_KEY
+#  DESCRIPTION
+#  Path to the SSH private key corresponding to the public key registered
+#  for uploading on sourceware.
+#****
+#SSH_KEY=~/.ssh/id_rsa
 
 # You can select your own mirrors to use instead of the generic list.
 # See the documentation for mirror list locations and default mirrors.
diff --git a/data/sample.cygport b/data/sample.cygport
index 9f54858..f89cb2e 100644
--- a/data/sample.cygport
+++ b/data/sample.cygport
@@ -16,7 +16,7 @@ ARCH=noarch
 DEPEND="groff help2man robodoc"
 # runtime deps to go in setup.hint, and note the escaped newline
 REQUIRES="autoconf automake binutils bzip2 coreutils diffstat diffutils \
-dos2unix findutils file gawk gcc-core gcc-g++ grep gzip libtool lndir \
+dos2unix findutils file gawk gcc-core gcc-g++ grep gzip lftp libtool lndir \
 make patch rsync sed tar texinfo unzip util-linux wget which xz"
 
 # We use the standard src_compile and src_test.
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 0c9a862..5e1e965 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -8,6 +8,7 @@ cygpart_DATA = \
 	lib/pkg_cleanup.cygpart		\
 	lib/pkg_info.cygpart		\
 	lib/pkg_pkg.cygpart		\
+	lib/pkg_upload.cygpart		\
 	lib/src_compile.cygpart		\
 	lib/src_fetch.cygpart		\
 	lib/src_install.cygpart		\
diff --git a/lib/help.cygpart b/lib/help.cygpart
index 4e82399..0fd9e61 100644
--- a/lib/help.cygpart
+++ b/lib/help.cygpart
@@ -46,6 +46,7 @@ __show_help() {
 		  test         run the package's test suite, if one exists
 		  install      install into a DESTDIR, and run post-installation steps
 		  package      create binary and source packages
+		  upload       upload finished packages to cygwin.com
 		  finish       delete the working directory
 		  all          run all of the above, excluding finish
 
diff --git a/lib/pkg_upload.cygpart b/lib/pkg_upload.cygpart
new file mode 100644
index 0000000..f505b9e
--- /dev/null
+++ b/lib/pkg_upload.cygpart
@@ -0,0 +1,92 @@
+################################################################################
+#
+# pkg_upload.cygpart - cygport package uploading functions
+#
+# Copyright (C) 2014 Andrew Schulman, Yaakov Selkowitz
+# Provided by the Cygwin Ports project <http://sourceware.org/cygwinports/>
+#
+# cygport is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cygport is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cygport.  If not, see <http://www.gnu.org/licenses/>.
+#
+################################################################################
+
+__pkg_upload() {
+	local d;
+	local f;
+	local -i n=0;
+	local -i missing=0;
+	local -a dist_files=(${PN}/${PN}-${PV}-${PR}-src.tar.xz ${PN}/setup.hint)
+	local -a archdir;
+
+	cd "${distdir}"
+
+	# Check that binary and source package files exist
+	while (( n < pkg_count ))
+	do
+		case ${pkg_name[${n}]} in
+		${PN})  distsubdir= ;;
+		*)      distsubdir=${pkg_name[${n}]} ;;
+		esac
+
+		dist_files+=(${PN}/${distsubdir}/${pkg_name[${n}]}-${PVR}.tar.xz ${PN}/${distsubdir}/setup.hint)
+
+		n+=1;
+	done
+
+	for f in ${dist_files[*]}
+	do
+		[ -f ${f} ] || missing+=1;
+	done
+
+	if (( missing > 0 ))
+	then
+		error "Package staging is incomplete. Run \"cygport ${cygportfile} package\" to stage packages for upload."
+	fi
+
+	# Upload
+
+	case ${ARCH} in
+		i686)	archdir=(x86) ;;
+		x86_64)	archdir=(x86_64) ;;
+		noarch) archdir=(x86 x86_64) ;;
+	esac
+
+	__step "Uploading..."
+
+	{
+		echo "set cmd:fail-exit on"
+		echo "set cmd:interactive on"
+		echo "set net:max-retries 1"
+
+		if test -n "$SSH_KEY"
+		then
+			echo "set sftp:connect-program ssh -a -x -i '${SSH_KEY}'"
+		fi
+
+		echo "open sftp://cygwin:@cygwin.com"
+
+		for d in ${archdir[*]}
+		do
+			echo "cd /${d}/release"
+#			echo "rm -f !ready || echo -n"
+			echo "mirror -v -eR ${PN}"
+			echo "put -O ${PN} /dev/null -o !ready"
+		done
+
+	} | lftp -f /dev/stdin || error "Upload failed"
+
+	__step "Upload complete."
+}
+
+# protect functions
+readonly -f __pkg_upload


More information about the Cygwin-apps mailing list