URL: https://github.com/freeipa/freeipa/pull/472
Author: tiran
 Title: #472: Packaging: Add placeholder packages
Action: synchronized

To pull the PR as Git branch:
git remote add ghfreeipa https://github.com/freeipa/freeipa
git fetch ghfreeipa pull/472/head:pr472
git checkout pr472
From 41acd1dc09f5ed5c03620f51e8e7a502c548ee47 Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Thu, 16 Feb 2017 15:27:49 +0100
Subject: [PATCH 1/7] Packaging: Add placeholder packages

The ipa and freeipa packages are placeholders to prevent PyPI squashing
attacks and reserve the names for future use. `pip install ipa` installs
ipaclient.

Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 Makefile.am                   |  6 +++---
 Makefile.python.am            | 21 +++++++++++++--------
 configure.ac                  |  3 +++
 packaging/Makefile.am         | 10 ++++++++++
 packaging/freeipa/Makefile.am |  3 +++
 packaging/freeipa/README.txt  |  2 ++
 packaging/freeipa/setup.cfg   |  6 ++++++
 packaging/freeipa/setup.py    | 23 +++++++++++++++++++++++
 packaging/ipa/Makefile.am     |  3 +++
 packaging/ipa/README.txt      |  2 ++
 packaging/ipa/setup.cfg       |  6 ++++++
 packaging/ipa/setup.py        | 23 +++++++++++++++++++++++
 12 files changed, 97 insertions(+), 11 deletions(-)
 create mode 100644 packaging/Makefile.am
 create mode 100644 packaging/freeipa/Makefile.am
 create mode 100644 packaging/freeipa/README.txt
 create mode 100644 packaging/freeipa/setup.cfg
 create mode 100755 packaging/freeipa/setup.py
 create mode 100644 packaging/ipa/Makefile.am
 create mode 100644 packaging/ipa/README.txt
 create mode 100644 packaging/ipa/setup.cfg
 create mode 100755 packaging/ipa/setup.py

diff --git a/Makefile.am b/Makefile.am
index a35d18f..9595c9d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,11 +9,9 @@ if WITH_IPATESTS
 endif
 
 IPACLIENT_SUBDIRS = ipaclient ipalib ipapython
-
-SUBDIRS = asn1 util client contrib po \
+SUBDIRS = asn1 util client contrib po pypi \
 	$(IPACLIENT_SUBDIRS) ipaplatform $(IPATESTS_SUBDIRS) $(SERVER_SUBDIRS)
 
-
 MOSTLYCLEANFILES = ipasetup.pyc ipasetup.pyo \
 		   ignore_import_errors.pyc ignore_import_errors.pyo \
 		   ipasetup.pyc ipasetup.pyo \
@@ -217,6 +215,8 @@ $(WHEELBUNDLEDIR):
 	mkdir -p $(WHEELBUNDLEDIR)
 
 bdist_wheel: $(WHEELDISTDIR)
+	$(MAKE) $(AM_MAKEFLAGS) -C packaging/ipa bdist_wheel || exit 1;
+	$(MAKE) $(AM_MAKEFLAGS) -C packaging/freeipa bdist_wheel || exit 1;
 	for dir in $(IPACLIENT_SUBDIRS); do \
 	    $(MAKE) $(AM_MAKEFLAGS) -C $${dir} $@ || exit 1; \
 	done
diff --git a/Makefile.python.am b/Makefile.python.am
index 665893f..9c34fe3 100644
--- a/Makefile.python.am
+++ b/Makefile.python.am
@@ -1,5 +1,6 @@
 pkgname = $(shell basename "$(abs_srcdir)")
 pkgpythondir = $(pythondir)/$(pkgname)
+pkginstall = true
 
 if VERBOSE_MAKE
 VERBOSITY="--verbose"
@@ -19,16 +20,20 @@ all-local: $(top_builddir)/ipasetup.py
 		--build-base "$(abs_builddir)/build"
 
 install-exec-local: $(top_builddir)/ipasetup.py
-	$(PYTHON) $(srcdir)/setup.py \
-		$(VERBOSITY) \
-		install \
-		--prefix "$(DESTDIR)$(prefix)" \
-		--single-version-externally-managed \
-		--record "$(DESTDIR)$(pkgpythondir)/install_files.txt" \
-		--optimize 1
+	if [ "x$(pkginstall)" = "xtrue" ]; then \
+	    $(PYTHON) $(srcdir)/setup.py \
+		    $(VERBOSITY) \
+		    install \
+		    --prefix "$(DESTDIR)$(prefix)" \
+		    --single-version-externally-managed \
+		    --record "$(DESTDIR)$(pkgpythondir)/install_files.txt" \
+		    --optimize 1; \
+	fi
 
 uninstall-local:
-	cat "$(DESTDIR)$(pkgpythondir)/install_files.txt" | xargs rm -rf
+	if [ -f "$(DESTDIR)$(pkgpythondir)/install_files.txt" ]; then \
+	    cat "$(DESTDIR)$(pkgpythondir)/install_files.txt" | xargs rm -rf ; \
+	fi
 	rm -rf "$(DESTDIR)$(pkgpythondir)"
 
 clean-local: $(top_builddir)/ipasetup.py
diff --git a/configure.ac b/configure.ac
index 9ee281a..ebdd358 100644
--- a/configure.ac
+++ b/configure.ac
@@ -484,6 +484,9 @@ AC_CONFIG_FILES([
     ipaserver/Makefile
     ipatests/Makefile
     ipatests/man/Makefile
+    packaging/Makefile
+    packaging/freeipa/Makefile
+    packaging/ipa/Makefile
     po/Makefile.in
     po/Makefile.hack
     util/Makefile
diff --git a/packaging/Makefile.am b/packaging/Makefile.am
new file mode 100644
index 0000000..5725ed9
--- /dev/null
+++ b/packaging/Makefile.am
@@ -0,0 +1,10 @@
+# This file will be processed with automake-1.7 to create Makefile.in
+#
+AUTOMAKE_OPTIONS = 1.7 subdir-objects
+
+NULL =
+
+SUBDIRS =			\
+	freeipa			\
+	ipa			\
+	$(NULL)
diff --git a/packaging/freeipa/Makefile.am b/packaging/freeipa/Makefile.am
new file mode 100644
index 0000000..15d86ce
--- /dev/null
+++ b/packaging/freeipa/Makefile.am
@@ -0,0 +1,3 @@
+include $(top_srcdir)/Makefile.python.am
+
+pkginstall = false
diff --git a/packaging/freeipa/README.txt b/packaging/freeipa/README.txt
new file mode 100644
index 0000000..b58448f
--- /dev/null
+++ b/packaging/freeipa/README.txt
@@ -0,0 +1,2 @@
+This is a dummy package for FreeIPA's ipaclient.
+
diff --git a/packaging/freeipa/setup.cfg b/packaging/freeipa/setup.cfg
new file mode 100644
index 0000000..62f65c7
--- /dev/null
+++ b/packaging/freeipa/setup.cfg
@@ -0,0 +1,6 @@
+[bdist_wheel]
+universal = 1
+
+[aliases]
+packages = clean --all egg_info bdist_wheel
+release = packages register upload
diff --git a/packaging/freeipa/setup.py b/packaging/freeipa/setup.py
new file mode 100755
index 0000000..230fffd
--- /dev/null
+++ b/packaging/freeipa/setup.py
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+"""Dummy package for FreeIPA
+
+Please install ipaclient instead.
+"""
+
+from os.path import abspath, dirname
+import sys
+
+if __name__ == '__main__':
+    # include ../../ for ipasetup.py
+    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
+    from ipasetup import ipasetup  # noqa: E402
+
+    ipasetup(
+        name='freeipa',
+        doc = __doc__,
+        install_requires=[
+            "ipaclient",
+        ]
+    )
diff --git a/packaging/ipa/Makefile.am b/packaging/ipa/Makefile.am
new file mode 100644
index 0000000..15d86ce
--- /dev/null
+++ b/packaging/ipa/Makefile.am
@@ -0,0 +1,3 @@
+include $(top_srcdir)/Makefile.python.am
+
+pkginstall = false
diff --git a/packaging/ipa/README.txt b/packaging/ipa/README.txt
new file mode 100644
index 0000000..b58448f
--- /dev/null
+++ b/packaging/ipa/README.txt
@@ -0,0 +1,2 @@
+This is a dummy package for FreeIPA's ipaclient.
+
diff --git a/packaging/ipa/setup.cfg b/packaging/ipa/setup.cfg
new file mode 100644
index 0000000..62f65c7
--- /dev/null
+++ b/packaging/ipa/setup.cfg
@@ -0,0 +1,6 @@
+[bdist_wheel]
+universal = 1
+
+[aliases]
+packages = clean --all egg_info bdist_wheel
+release = packages register upload
diff --git a/packaging/ipa/setup.py b/packaging/ipa/setup.py
new file mode 100755
index 0000000..403389b
--- /dev/null
+++ b/packaging/ipa/setup.py
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+"""Dummy package for FreeIPA
+
+Please install ipaclient instead.
+"""
+
+from os.path import abspath, dirname
+import sys
+
+if __name__ == '__main__':
+    # include ../../ for ipasetup.py
+    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
+    from ipasetup import ipasetup  # noqa: E402
+
+    ipasetup(
+        name='ipa',
+        doc = __doc__,
+        install_requires=[
+            "ipaclient",
+        ]
+    )

From eabac6820d311b7d3c28683fd65f7c4f2d466976 Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Fri, 17 Feb 2017 17:46:20 +0100
Subject: [PATCH 2/7] Add python-wheel as build requirement

Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 freeipa.spec.in | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/freeipa.spec.in b/freeipa.spec.in
index 5c835ca..acc197e 100644
--- a/freeipa.spec.in
+++ b/freeipa.spec.in
@@ -124,6 +124,16 @@ BuildRequires:  python-libsss_nss_idmap
 BuildRequires:  python-cffi
 
 #
+# Build dependencies for wheel packaging
+#
+%if 0%{?fedora}
+BuildRequires:  python2-wheel
+%if 0%{?with_python3}
+BuildRequires:  python3-wheel
+%endif
+%endif # Fedora
+
+#
 # Build dependencies for lint
 #
 %if 0%{?with_lint}

From e269b89168106c1d78a4643a639503e2cf1f2089 Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Fri, 17 Feb 2017 17:46:42 +0100
Subject: [PATCH 3/7] Add placeholders for ipaplatform, ipaserver and ipatests

I also renamed the base directory to pypi and added a new build target
pypi_packages.

Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 Makefile.am                              | 14 +++++++++++---
 Makefile.python.am                       |  2 +-
 configure.ac                             |  9 ++++++---
 packaging/Makefile.am                    | 10 ----------
 packaging/freeipa/Makefile.am            |  3 ---
 packaging/freeipa/README.txt             |  2 --
 packaging/freeipa/setup.cfg              |  6 ------
 packaging/freeipa/setup.py               | 23 -----------------------
 packaging/ipa/Makefile.am                |  3 ---
 packaging/ipa/README.txt                 |  2 --
 packaging/ipa/setup.cfg                  |  6 ------
 packaging/ipa/setup.py                   | 23 -----------------------
 pypi/Makefile.am                         | 13 +++++++++++++
 pypi/freeipa/Makefile.am                 |  3 +++
 pypi/freeipa/README.txt                  |  2 ++
 pypi/freeipa/setup.cfg                   |  6 ++++++
 pypi/freeipa/setup.py                    | 23 +++++++++++++++++++++++
 pypi/ipa/Makefile.am                     |  3 +++
 pypi/ipa/README.txt                      |  2 ++
 pypi/ipa/setup.cfg                       |  6 ++++++
 pypi/ipa/setup.py                        | 23 +++++++++++++++++++++++
 pypi/ipaplatform/Makefile.am             |  3 +++
 pypi/ipaplatform/README.txt              |  2 ++
 pypi/ipaplatform/ipaplatform/__init__.py |  5 +++++
 pypi/ipaplatform/setup.cfg               |  6 ++++++
 pypi/ipaplatform/setup.py                | 26 ++++++++++++++++++++++++++
 pypi/ipaserver/Makefile.am               |  3 +++
 pypi/ipaserver/README.txt                |  2 ++
 pypi/ipaserver/ipaserver/__init__.py     |  5 +++++
 pypi/ipaserver/setup.cfg                 |  6 ++++++
 pypi/ipaserver/setup.py                  | 26 ++++++++++++++++++++++++++
 pypi/ipatests/Makefile.am                |  3 +++
 pypi/ipatests/README.txt                 |  2 ++
 pypi/ipatests/ipatests/__init__.py       |  5 +++++
 pypi/ipatests/setup.cfg                  |  6 ++++++
 pypi/ipatests/setup.py                   | 26 ++++++++++++++++++++++++++
 36 files changed, 225 insertions(+), 85 deletions(-)
 delete mode 100644 packaging/Makefile.am
 delete mode 100644 packaging/freeipa/Makefile.am
 delete mode 100644 packaging/freeipa/README.txt
 delete mode 100644 packaging/freeipa/setup.cfg
 delete mode 100755 packaging/freeipa/setup.py
 delete mode 100644 packaging/ipa/Makefile.am
 delete mode 100644 packaging/ipa/README.txt
 delete mode 100644 packaging/ipa/setup.cfg
 delete mode 100755 packaging/ipa/setup.py
 create mode 100644 pypi/Makefile.am
 create mode 100644 pypi/freeipa/Makefile.am
 create mode 100644 pypi/freeipa/README.txt
 create mode 100644 pypi/freeipa/setup.cfg
 create mode 100755 pypi/freeipa/setup.py
 create mode 100644 pypi/ipa/Makefile.am
 create mode 100644 pypi/ipa/README.txt
 create mode 100644 pypi/ipa/setup.cfg
 create mode 100755 pypi/ipa/setup.py
 create mode 100644 pypi/ipaplatform/Makefile.am
 create mode 100644 pypi/ipaplatform/README.txt
 create mode 100644 pypi/ipaplatform/ipaplatform/__init__.py
 create mode 100644 pypi/ipaplatform/setup.cfg
 create mode 100755 pypi/ipaplatform/setup.py
 create mode 100644 pypi/ipaserver/Makefile.am
 create mode 100644 pypi/ipaserver/README.txt
 create mode 100644 pypi/ipaserver/ipaserver/__init__.py
 create mode 100644 pypi/ipaserver/setup.cfg
 create mode 100755 pypi/ipaserver/setup.py
 create mode 100644 pypi/ipatests/Makefile.am
 create mode 100644 pypi/ipatests/README.txt
 create mode 100644 pypi/ipatests/ipatests/__init__.py
 create mode 100644 pypi/ipatests/setup.cfg
 create mode 100755 pypi/ipatests/setup.py

diff --git a/Makefile.am b/Makefile.am
index 9595c9d..26ba379 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,6 +9,7 @@ if WITH_IPATESTS
 endif
 
 IPACLIENT_SUBDIRS = ipaclient ipalib ipapython
+IPA_PLACEHOLDERS = freeipa ipa ipaplatform ipaserver ipatests
 SUBDIRS = asn1 util client contrib po pypi \
 	$(IPACLIENT_SUBDIRS) ipaplatform $(IPATESTS_SUBDIRS) $(SERVER_SUBDIRS)
 
@@ -204,7 +205,7 @@ jslint-html:
 	cd $(top_srcdir)/install/html; 				\
 	jsl -nologo -nosummary -nofilelisting -conf jsl.conf
 
-.PHONY: bdist_wheel wheel_bundle
+.PHONY: bdist_wheel wheel_bundle wheel_placeholder pypi_packages
 WHEELDISTDIR = $(top_builddir)/dist/wheels
 WHEELBUNDLEDIR = $(top_builddir)/dist/bundle
 
@@ -215,8 +216,6 @@ $(WHEELBUNDLEDIR):
 	mkdir -p $(WHEELBUNDLEDIR)
 
 bdist_wheel: $(WHEELDISTDIR)
-	$(MAKE) $(AM_MAKEFLAGS) -C packaging/ipa bdist_wheel || exit 1;
-	$(MAKE) $(AM_MAKEFLAGS) -C packaging/freeipa bdist_wheel || exit 1;
 	for dir in $(IPACLIENT_SUBDIRS); do \
 	    $(MAKE) $(AM_MAKEFLAGS) -C $${dir} $@ || exit 1; \
 	done
@@ -224,6 +223,15 @@ bdist_wheel: $(WHEELDISTDIR)
 wheel_bundle: $(WHEELBUNDLEDIR) bdist_wheel
 	$(PYTHON) -m pip wheel --wheel-dir $(WHEELBUNDLEDIR) $(WHEELDISTDIR)/*.whl
 
+wheel_placeholder: $(WHEELDISTDIR)
+	for dir in $(IPA_PLACEHOLDERS); do \
+	    $(MAKE) $(AM_MAKEFLAGS) -C $(top_srcdir)/pypi/$${dir} bdist_wheel || exit 1; \
+	done
+
+pypi_packages: bdist_wheel wheel_placeholder
+	@echo -e "\n\nTo upload packages to PyPI, run:\n"
+	@echo -e "    twine upload $(WHEELDISTDIR)/*-$(VERSION)-py2.py3-none-any.whl\n"
+
 .PHONY:
 strip-po:
 	$(MAKE) -C po strip-po
diff --git a/Makefile.python.am b/Makefile.python.am
index 9c34fe3..e4efc17 100644
--- a/Makefile.python.am
+++ b/Makefile.python.am
@@ -58,5 +58,5 @@ dist-hook: $(top_builddir)/ipasetup.py
 WHEELDISTDIR = $(top_builddir)/dist/wheels
 .PHONY: bdist_wheel
 bdist_wheel: $(top_builddir)/ipasetup.py
-	rm -rf $(WHEELDISTDIR)/$(pkgname)*.whl
+	rm -rf $(WHEELDISTDIR)/$(pkgname)-*.whl
 	$(PYTHON) "$(srcdir)/setup.py" bdist_wheel --dist-dir=$(WHEELDISTDIR)
diff --git a/configure.ac b/configure.ac
index ebdd358..3f726bc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -484,9 +484,12 @@ AC_CONFIG_FILES([
     ipaserver/Makefile
     ipatests/Makefile
     ipatests/man/Makefile
-    packaging/Makefile
-    packaging/freeipa/Makefile
-    packaging/ipa/Makefile
+    pypi/Makefile
+    pypi/freeipa/Makefile
+    pypi/ipa/Makefile
+    pypi/ipaplatform/Makefile
+    pypi/ipaserver/Makefile
+    pypi/ipatests/Makefile
     po/Makefile.in
     po/Makefile.hack
     util/Makefile
diff --git a/packaging/Makefile.am b/packaging/Makefile.am
deleted file mode 100644
index 5725ed9..0000000
--- a/packaging/Makefile.am
+++ /dev/null
@@ -1,10 +0,0 @@
-# This file will be processed with automake-1.7 to create Makefile.in
-#
-AUTOMAKE_OPTIONS = 1.7 subdir-objects
-
-NULL =
-
-SUBDIRS =			\
-	freeipa			\
-	ipa			\
-	$(NULL)
diff --git a/packaging/freeipa/Makefile.am b/packaging/freeipa/Makefile.am
deleted file mode 100644
index 15d86ce..0000000
--- a/packaging/freeipa/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-include $(top_srcdir)/Makefile.python.am
-
-pkginstall = false
diff --git a/packaging/freeipa/README.txt b/packaging/freeipa/README.txt
deleted file mode 100644
index b58448f..0000000
--- a/packaging/freeipa/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This is a dummy package for FreeIPA's ipaclient.
-
diff --git a/packaging/freeipa/setup.cfg b/packaging/freeipa/setup.cfg
deleted file mode 100644
index 62f65c7..0000000
--- a/packaging/freeipa/setup.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-[bdist_wheel]
-universal = 1
-
-[aliases]
-packages = clean --all egg_info bdist_wheel
-release = packages register upload
diff --git a/packaging/freeipa/setup.py b/packaging/freeipa/setup.py
deleted file mode 100755
index 230fffd..0000000
--- a/packaging/freeipa/setup.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
-#
-"""Dummy package for FreeIPA
-
-Please install ipaclient instead.
-"""
-
-from os.path import abspath, dirname
-import sys
-
-if __name__ == '__main__':
-    # include ../../ for ipasetup.py
-    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
-    from ipasetup import ipasetup  # noqa: E402
-
-    ipasetup(
-        name='freeipa',
-        doc = __doc__,
-        install_requires=[
-            "ipaclient",
-        ]
-    )
diff --git a/packaging/ipa/Makefile.am b/packaging/ipa/Makefile.am
deleted file mode 100644
index 15d86ce..0000000
--- a/packaging/ipa/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-include $(top_srcdir)/Makefile.python.am
-
-pkginstall = false
diff --git a/packaging/ipa/README.txt b/packaging/ipa/README.txt
deleted file mode 100644
index b58448f..0000000
--- a/packaging/ipa/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-This is a dummy package for FreeIPA's ipaclient.
-
diff --git a/packaging/ipa/setup.cfg b/packaging/ipa/setup.cfg
deleted file mode 100644
index 62f65c7..0000000
--- a/packaging/ipa/setup.cfg
+++ /dev/null
@@ -1,6 +0,0 @@
-[bdist_wheel]
-universal = 1
-
-[aliases]
-packages = clean --all egg_info bdist_wheel
-release = packages register upload
diff --git a/packaging/ipa/setup.py b/packaging/ipa/setup.py
deleted file mode 100755
index 403389b..0000000
--- a/packaging/ipa/setup.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
-#
-"""Dummy package for FreeIPA
-
-Please install ipaclient instead.
-"""
-
-from os.path import abspath, dirname
-import sys
-
-if __name__ == '__main__':
-    # include ../../ for ipasetup.py
-    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
-    from ipasetup import ipasetup  # noqa: E402
-
-    ipasetup(
-        name='ipa',
-        doc = __doc__,
-        install_requires=[
-            "ipaclient",
-        ]
-    )
diff --git a/pypi/Makefile.am b/pypi/Makefile.am
new file mode 100644
index 0000000..5d8be9c
--- /dev/null
+++ b/pypi/Makefile.am
@@ -0,0 +1,13 @@
+# This file will be processed with automake-1.7 to create Makefile.in
+#
+AUTOMAKE_OPTIONS = 1.7 subdir-objects
+
+NULL =
+
+SUBDIRS =			\
+	freeipa			\
+	ipa				\
+	ipaplatform		\
+	ipaserver		\
+	ipatests		\
+	$(NULL)
diff --git a/pypi/freeipa/Makefile.am b/pypi/freeipa/Makefile.am
new file mode 100644
index 0000000..15d86ce
--- /dev/null
+++ b/pypi/freeipa/Makefile.am
@@ -0,0 +1,3 @@
+include $(top_srcdir)/Makefile.python.am
+
+pkginstall = false
diff --git a/pypi/freeipa/README.txt b/pypi/freeipa/README.txt
new file mode 100644
index 0000000..b58448f
--- /dev/null
+++ b/pypi/freeipa/README.txt
@@ -0,0 +1,2 @@
+This is a dummy package for FreeIPA's ipaclient.
+
diff --git a/pypi/freeipa/setup.cfg b/pypi/freeipa/setup.cfg
new file mode 100644
index 0000000..62f65c7
--- /dev/null
+++ b/pypi/freeipa/setup.cfg
@@ -0,0 +1,6 @@
+[bdist_wheel]
+universal = 1
+
+[aliases]
+packages = clean --all egg_info bdist_wheel
+release = packages register upload
diff --git a/pypi/freeipa/setup.py b/pypi/freeipa/setup.py
new file mode 100755
index 0000000..230fffd
--- /dev/null
+++ b/pypi/freeipa/setup.py
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+"""Dummy package for FreeIPA
+
+Please install ipaclient instead.
+"""
+
+from os.path import abspath, dirname
+import sys
+
+if __name__ == '__main__':
+    # include ../../ for ipasetup.py
+    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
+    from ipasetup import ipasetup  # noqa: E402
+
+    ipasetup(
+        name='freeipa',
+        doc = __doc__,
+        install_requires=[
+            "ipaclient",
+        ]
+    )
diff --git a/pypi/ipa/Makefile.am b/pypi/ipa/Makefile.am
new file mode 100644
index 0000000..15d86ce
--- /dev/null
+++ b/pypi/ipa/Makefile.am
@@ -0,0 +1,3 @@
+include $(top_srcdir)/Makefile.python.am
+
+pkginstall = false
diff --git a/pypi/ipa/README.txt b/pypi/ipa/README.txt
new file mode 100644
index 0000000..b58448f
--- /dev/null
+++ b/pypi/ipa/README.txt
@@ -0,0 +1,2 @@
+This is a dummy package for FreeIPA's ipaclient.
+
diff --git a/pypi/ipa/setup.cfg b/pypi/ipa/setup.cfg
new file mode 100644
index 0000000..62f65c7
--- /dev/null
+++ b/pypi/ipa/setup.cfg
@@ -0,0 +1,6 @@
+[bdist_wheel]
+universal = 1
+
+[aliases]
+packages = clean --all egg_info bdist_wheel
+release = packages register upload
diff --git a/pypi/ipa/setup.py b/pypi/ipa/setup.py
new file mode 100755
index 0000000..403389b
--- /dev/null
+++ b/pypi/ipa/setup.py
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+"""Dummy package for FreeIPA
+
+Please install ipaclient instead.
+"""
+
+from os.path import abspath, dirname
+import sys
+
+if __name__ == '__main__':
+    # include ../../ for ipasetup.py
+    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
+    from ipasetup import ipasetup  # noqa: E402
+
+    ipasetup(
+        name='ipa',
+        doc = __doc__,
+        install_requires=[
+            "ipaclient",
+        ]
+    )
diff --git a/pypi/ipaplatform/Makefile.am b/pypi/ipaplatform/Makefile.am
new file mode 100644
index 0000000..15d86ce
--- /dev/null
+++ b/pypi/ipaplatform/Makefile.am
@@ -0,0 +1,3 @@
+include $(top_srcdir)/Makefile.python.am
+
+pkginstall = false
diff --git a/pypi/ipaplatform/README.txt b/pypi/ipaplatform/README.txt
new file mode 100644
index 0000000..15064b0
--- /dev/null
+++ b/pypi/ipaplatform/README.txt
@@ -0,0 +1,2 @@
+This is a dummy package for FreeIPA's ipaplatform.
+
diff --git a/pypi/ipaplatform/ipaplatform/__init__.py b/pypi/ipaplatform/ipaplatform/__init__.py
new file mode 100644
index 0000000..3b12c8c
--- /dev/null
+++ b/pypi/ipaplatform/ipaplatform/__init__.py
@@ -0,0 +1,5 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+
+raise ImportError("ipaplatform is not yet supported as PyPI package.")
diff --git a/pypi/ipaplatform/setup.cfg b/pypi/ipaplatform/setup.cfg
new file mode 100644
index 0000000..62f65c7
--- /dev/null
+++ b/pypi/ipaplatform/setup.cfg
@@ -0,0 +1,6 @@
+[bdist_wheel]
+universal = 1
+
+[aliases]
+packages = clean --all egg_info bdist_wheel
+release = packages register upload
diff --git a/pypi/ipaplatform/setup.py b/pypi/ipaplatform/setup.py
new file mode 100755
index 0000000..f0fca2c
--- /dev/null
+++ b/pypi/ipaplatform/setup.py
@@ -0,0 +1,26 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+"""Dummy package for FreeIPA
+
+ipaplatform is not yet available as PyPI package.
+"""
+
+from os.path import abspath, dirname
+import sys
+
+if __name__ == '__main__':
+    # include ../../ for ipasetup.py
+    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
+    from ipasetup import ipasetup  # noqa: E402
+
+    ipasetup(
+        name='ipaplatform',
+        doc = __doc__,
+        packages=[
+            "ipaplatform",
+        ],
+        install_requires=[
+            "ipaclient",
+        ]
+    )
diff --git a/pypi/ipaserver/Makefile.am b/pypi/ipaserver/Makefile.am
new file mode 100644
index 0000000..15d86ce
--- /dev/null
+++ b/pypi/ipaserver/Makefile.am
@@ -0,0 +1,3 @@
+include $(top_srcdir)/Makefile.python.am
+
+pkginstall = false
diff --git a/pypi/ipaserver/README.txt b/pypi/ipaserver/README.txt
new file mode 100644
index 0000000..dea6ac4
--- /dev/null
+++ b/pypi/ipaserver/README.txt
@@ -0,0 +1,2 @@
+This is a dummy package for FreeIPA's ipaserver.
+
diff --git a/pypi/ipaserver/ipaserver/__init__.py b/pypi/ipaserver/ipaserver/__init__.py
new file mode 100644
index 0000000..4cbf200
--- /dev/null
+++ b/pypi/ipaserver/ipaserver/__init__.py
@@ -0,0 +1,5 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+
+raise ImportError("ipaserver is not yet supported as PyPI package.")
diff --git a/pypi/ipaserver/setup.cfg b/pypi/ipaserver/setup.cfg
new file mode 100644
index 0000000..62f65c7
--- /dev/null
+++ b/pypi/ipaserver/setup.cfg
@@ -0,0 +1,6 @@
+[bdist_wheel]
+universal = 1
+
+[aliases]
+packages = clean --all egg_info bdist_wheel
+release = packages register upload
diff --git a/pypi/ipaserver/setup.py b/pypi/ipaserver/setup.py
new file mode 100755
index 0000000..73e1e63
--- /dev/null
+++ b/pypi/ipaserver/setup.py
@@ -0,0 +1,26 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+"""Dummy package for FreeIPA
+
+ipatests is not yet available as PyPI package.
+"""
+
+from os.path import abspath, dirname
+import sys
+
+if __name__ == '__main__':
+    # include ../../ for ipasetup.py
+    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
+    from ipasetup import ipasetup  # noqa: E402
+
+    ipasetup(
+        name='ipaserver',
+        doc = __doc__,
+        packages=[
+            "ipaserver",
+        ],
+        install_requires=[
+            "ipaclient",
+        ]
+    )
diff --git a/pypi/ipatests/Makefile.am b/pypi/ipatests/Makefile.am
new file mode 100644
index 0000000..15d86ce
--- /dev/null
+++ b/pypi/ipatests/Makefile.am
@@ -0,0 +1,3 @@
+include $(top_srcdir)/Makefile.python.am
+
+pkginstall = false
diff --git a/pypi/ipatests/README.txt b/pypi/ipatests/README.txt
new file mode 100644
index 0000000..3347eac
--- /dev/null
+++ b/pypi/ipatests/README.txt
@@ -0,0 +1,2 @@
+This is a dummy package for FreeIPA's ipatests.
+
diff --git a/pypi/ipatests/ipatests/__init__.py b/pypi/ipatests/ipatests/__init__.py
new file mode 100644
index 0000000..5592c53
--- /dev/null
+++ b/pypi/ipatests/ipatests/__init__.py
@@ -0,0 +1,5 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+
+raise ImportError("ipatests is not yet supported as PyPI package.")
diff --git a/pypi/ipatests/setup.cfg b/pypi/ipatests/setup.cfg
new file mode 100644
index 0000000..62f65c7
--- /dev/null
+++ b/pypi/ipatests/setup.cfg
@@ -0,0 +1,6 @@
+[bdist_wheel]
+universal = 1
+
+[aliases]
+packages = clean --all egg_info bdist_wheel
+release = packages register upload
diff --git a/pypi/ipatests/setup.py b/pypi/ipatests/setup.py
new file mode 100755
index 0000000..808e510
--- /dev/null
+++ b/pypi/ipatests/setup.py
@@ -0,0 +1,26 @@
+#
+# Copyright (C) 2017 FreeIPA Contributors see COPYING for license
+#
+"""Dummy package for FreeIPA
+
+ipatests is not yet available as PyPI package.
+"""
+
+from os.path import abspath, dirname
+import sys
+
+if __name__ == '__main__':
+    # include ../../ for ipasetup.py
+    sys.path.append(dirname(dirname(dirname(abspath(__file__)))))
+    from ipasetup import ipasetup  # noqa: E402
+
+    ipasetup(
+        name='ipatests',
+        doc = __doc__,
+        packages=[
+            "ipatests",
+        ],
+        install_requires=[
+            "ipaclient",
+        ]
+    )

From 69a606bc0857df3adb3921ecc278dd80f27107bb Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Wed, 22 Feb 2017 09:21:35 +0100
Subject: [PATCH 4/7] Add with_wheels global to install wheel and PyPI
 packaging dependencies

Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 freeipa.spec.in | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/freeipa.spec.in b/freeipa.spec.in
index acc197e..d8602c9 100644
--- a/freeipa.spec.in
+++ b/freeipa.spec.in
@@ -17,6 +17,9 @@
     %global without_jslint_option --without-jslint
 %endif
 
+# Python wheel support and PyPI packages
+%global with_wheels 0
+
 %global alt_name ipa
 %if 0%{?rhel}
 %global samba_version 4.0.5-1
@@ -124,14 +127,16 @@ BuildRequires:  python-libsss_nss_idmap
 BuildRequires:  python-cffi
 
 #
-# Build dependencies for wheel packaging
+# Build dependencies for wheel packaging and PyPI upload
 #
-%if 0%{?fedora}
+%if 0%{with_wheels}
+BuildRequires:  python2-twine
 BuildRequires:  python2-wheel
 %if 0%{?with_python3}
+BuildRequires:  python3-twine
 BuildRequires:  python3-wheel
 %endif
-%endif # Fedora
+%endif # with_wheels
 
 #
 # Build dependencies for lint

From 6839d953313392073fdaba914864074c42730acf Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Thu, 23 Feb 2017 14:12:22 +0100
Subject: [PATCH 5/7] Python build: use --build-base everywhere

Some calls to setup.py specified a build base, some did not. This can
lead to issues, e.g. build, clean and install are using different build
directories.

Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 Makefile.python.am | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/Makefile.python.am b/Makefile.python.am
index e4efc17..4b9dc1d 100644
--- a/Makefile.python.am
+++ b/Makefile.python.am
@@ -17,17 +17,19 @@ all-local: $(top_builddir)/ipasetup.py
 	cd $(srcdir); $(PYTHON) setup.py \
 		$(VERBOSITY) \
 		build \
-		--build-base "$(abs_builddir)/build"
+		    --build-base "$(abs_builddir)/build"
 
 install-exec-local: $(top_builddir)/ipasetup.py
 	if [ "x$(pkginstall)" = "xtrue" ]; then \
 	    $(PYTHON) $(srcdir)/setup.py \
 		    $(VERBOSITY) \
+		    build \
+		        --build-base "$(abs_builddir)/build" \
 		    install \
-		    --prefix "$(DESTDIR)$(prefix)" \
-		    --single-version-externally-managed \
-		    --record "$(DESTDIR)$(pkgpythondir)/install_files.txt" \
-		    --optimize 1; \
+		        --prefix "$(DESTDIR)$(prefix)" \
+		        --single-version-externally-managed \
+		        --record "$(DESTDIR)$(pkgpythondir)/install_files.txt" \
+		        --optimize 1; \
 	fi
 
 uninstall-local:
@@ -37,7 +39,10 @@ uninstall-local:
 	rm -rf "$(DESTDIR)$(pkgpythondir)"
 
 clean-local: $(top_builddir)/ipasetup.py
-	$(PYTHON) "$(srcdir)/setup.py" clean --all
+	$(PYTHON) "$(srcdir)/setup.py" \
+	    clean \
+	        --all
+	        --build-base "$(abs_builddir)/build"
 	rm -rf "$(srcdir)/build" "$(srcdir)/dist" "$(srcdir)/MANIFEST"
 	find "$(srcdir)" \
 		-name "*.py[co]" -delete -o	\
@@ -59,4 +64,8 @@ WHEELDISTDIR = $(top_builddir)/dist/wheels
 .PHONY: bdist_wheel
 bdist_wheel: $(top_builddir)/ipasetup.py
 	rm -rf $(WHEELDISTDIR)/$(pkgname)-*.whl
-	$(PYTHON) "$(srcdir)/setup.py" bdist_wheel --dist-dir=$(WHEELDISTDIR)
+	$(PYTHON) "$(srcdir)/setup.py" \
+	    build \
+	        --build-base "$(abs_builddir)/build" \
+	    bdist_wheel \
+	        --dist-dir=$(WHEELDISTDIR)

From 13870125e2cc66bcc02683cb854ed9c59cbcc561 Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Thu, 23 Feb 2017 16:19:30 +0100
Subject: [PATCH 6/7] pylint: ignore pypi placeholders

pylint gets confused by duplicated package names, e.g. ipaplatform and
pypi/ipaplatform.

Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 Makefile.am | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Makefile.am b/Makefile.am
index 26ba379..a6ff627 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -171,6 +171,7 @@ pylint: $(top_builddir)/ipapython/version.py ipasetup.py
 		-path './rpmbuild' -prune -o \
 		-path './freeipa-*' -prune -o \
 		-path './dist' -prune -o \
+		-path './pypi' -prune -o \
 		-name '.*' -o \
 		-name '*.in' -o \
 		-name '*~' -o \

From 15535d651c1116b5fa623a6affa20fe90e14cd4f Mon Sep 17 00:00:00 2001
From: Christian Heimes <chei...@redhat.com>
Date: Thu, 23 Feb 2017 16:26:14 +0100
Subject: [PATCH 7/7] Default to pkginstall=true without duplicated definitions

automake was complaining about duplicated definitions of pkginstall. It
was defined to true in Makefile.python.am only to be overriden in some
Makefile.am.

Now we assume that pkginstall is implicit true and only skip
installation when pkginstall is explicitly set to false.

Signed-off-by: Christian Heimes <chei...@redhat.com>
---
 Makefile.python.am | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/Makefile.python.am b/Makefile.python.am
index 4b9dc1d..f158ff5 100644
--- a/Makefile.python.am
+++ b/Makefile.python.am
@@ -1,6 +1,5 @@
 pkgname = $(shell basename "$(abs_srcdir)")
 pkgpythondir = $(pythondir)/$(pkgname)
-pkginstall = true
 
 if VERBOSE_MAKE
 VERBOSITY="--verbose"
@@ -20,7 +19,7 @@ all-local: $(top_builddir)/ipasetup.py
 		    --build-base "$(abs_builddir)/build"
 
 install-exec-local: $(top_builddir)/ipasetup.py
-	if [ "x$(pkginstall)" = "xtrue" ]; then \
+	if [ "x$(pkginstall)" != "xfalse" ]; then \
 	    $(PYTHON) $(srcdir)/setup.py \
 		    $(VERBOSITY) \
 		    build \
-- 
Manage your subscription for the Freeipa-devel mailing list:
https://www.redhat.com/mailman/listinfo/freeipa-devel
Contribute to FreeIPA: http://www.freeipa.org/page/Contribute/Code

Reply via email to