mirror of
https://github.com/clearlinux/common.git
synced 2026-06-16 19:16:00 +00:00
Compare commits
198 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6a54f15cb6 | |||
| fa42020aa9 | |||
| a727fe3722 | |||
| c41eeea37a | |||
| a07f64294f | |||
| 59a3a29c4c | |||
| cba91e5044 | |||
| a5d39507cc | |||
| dc644c29a0 | |||
| f5febd9cd6 | |||
| 33911b18e5 | |||
| 13e5e26cbf | |||
| 4845303ae6 | |||
| 6fdc492121 | |||
| 7614474aba | |||
| 5bee2e96d2 | |||
| 6cc08f74e7 | |||
| 5b64c9b888 | |||
| 88c420528d | |||
| 98c7c4cb76 | |||
| e2ce4353b6 | |||
| 08512d3f2b | |||
| f6be3f440a | |||
| 1a79ab1700 | |||
| a6fa6599bb | |||
| 9d6c5e6677 | |||
| 460ce05217 | |||
| 8a2da3412d | |||
| 94624262ae | |||
| 15a220803f | |||
| 4130c1c97d | |||
| 7c28f0608d | |||
| 1b0945c33d | |||
| 1300eba2b4 | |||
| 91a900675e | |||
| b137543491 | |||
| bb27567407 | |||
| 2973364b2e | |||
| 865997ad69 | |||
| 70bfbe8c17 | |||
| 3b1e4e5558 | |||
| 2465219907 | |||
| 77775f060c | |||
| 67406f7be2 | |||
| 9bece241c0 | |||
| 602cc9563f | |||
| 02b5ad93e3 | |||
| fb40533923 | |||
| 06dd86a3b9 | |||
| 9db26c3041 | |||
| ade6194a0c | |||
| a8d18b2f92 | |||
| c2d637b438 | |||
| 48d06e458d | |||
| 0ba3b95dad | |||
| 9749d00c56 | |||
| 7841d4dd5c | |||
| 91c89fe47d | |||
| 9d696fee5a | |||
| 54aea8a696 | |||
| a4545eb4b0 | |||
| 35d4f2c00f | |||
| 15c22ac4eb | |||
| 1c672f7638 | |||
| d0832c89f4 | |||
| 3a87e928c5 | |||
| 5ba1a7e1e3 | |||
| ba02bc2a4f | |||
| 0ef90a4704 | |||
| 0b39553aa6 | |||
| 7cd52ed2fd | |||
| a379bdd1e5 | |||
| b8eaa3c103 | |||
| 0664274e0a | |||
| 69cee2fcd7 | |||
| 19d7dfcc56 | |||
| 25e60b8d7f | |||
| c6749e0569 | |||
| 79b17335fa | |||
| 18503d7ff9 | |||
| d4a14d4b51 | |||
| 67f9a85781 | |||
| 2ab93bc546 | |||
| 0697a48265 | |||
| 3488d9df0b | |||
| 7eda6b13d5 | |||
| 22cf4d9aaa | |||
| abf88fe302 | |||
| e7d86e5ace | |||
| 0ca8a71a6a | |||
| c594d50d97 | |||
| 923b813833 | |||
| facfc57d55 | |||
| 9e0d404e52 | |||
| 9d954cb33a | |||
| 158c743fde | |||
| c5969bbd83 | |||
| cb01f2b9ef | |||
| c58e39da50 | |||
| 26dea91314 | |||
| efa4e1bcf8 | |||
| 9fba303a7b | |||
| eefffcb4cd | |||
| ae59dd4aa9 | |||
| 9ed6cf64eb | |||
| 1e1a52e948 | |||
| b9d3725172 | |||
| d2c0eea1d2 | |||
| 038007f64a | |||
| 930a8bd3f7 | |||
| 33c27808a6 | |||
| f9b7f544be | |||
| 6fe60137f4 | |||
| b32e466635 | |||
| 755bd91716 | |||
| d2b615d14b | |||
| 71b5075a7b | |||
| fd6bcb7b24 | |||
| 771b704606 | |||
| b3ea1cd421 | |||
| 752274f532 | |||
| 1addfd447d | |||
| 8546a126bd | |||
| 280d5471d7 | |||
| 025c9a74f1 | |||
| b03db840a6 | |||
| 59dfc2236f | |||
| e61ebaafc6 | |||
| 4bcceb402e | |||
| 5e15b47efc | |||
| 043265171f | |||
| 982d58e0e6 | |||
| accf578c02 | |||
| efe2b2bccf | |||
| 9f77cbb6e3 | |||
| bd6c14938b | |||
| 32729558d9 | |||
| b2ad8dbda8 | |||
| e545190de3 | |||
| 9921115897 | |||
| 8d5f8e37c5 | |||
| 6bc5718c25 | |||
| a21156767e | |||
| 9dd5bb895b | |||
| 67b7ef2bf4 | |||
| 6ad56934fd | |||
| 7b08135720 | |||
| 168c9b8606 | |||
| 3ff4181689 | |||
| a581ac8fbf | |||
| 601ca9e0fc | |||
| 8848658fcf | |||
| b76a7bc7f8 | |||
| f8f9619eec | |||
| b7b8774581 | |||
| b3618cc43c | |||
| 921ac270fe | |||
| f41acbdeb0 | |||
| 83a461fe40 | |||
| 6876f3d11e | |||
| 5a4dd4451a | |||
| d48889eb29 | |||
| b402f2bbdf | |||
| 1fcaa4aea6 | |||
| 71b927321f | |||
| 40f17091a6 | |||
| 3b062e1b45 | |||
| 3c3fc1a16c | |||
| 3c7aac6a8e | |||
| baf555428f | |||
| 262d005c62 | |||
| ceff8301a1 | |||
| 8eb7264597 | |||
| c10d558ee6 | |||
| bd75d90fc7 | |||
| 081c620f82 | |||
| 7e017ee247 | |||
| 5b43360fe8 | |||
| eb8879f0f0 | |||
| f18ba9060d | |||
| 9fc1471023 | |||
| 9885cdbf9b | |||
| ce12c754ba | |||
| b363871adf | |||
| c028ea0072 | |||
| 7dc414433f | |||
| 50f18a0146 | |||
| 51c26d9a01 | |||
| c143f7ee95 | |||
| 81bd7f5e54 | |||
| 5d8e976a2a | |||
| 7d624ab7ae | |||
| ba14c4e50f | |||
| 34fb007895 | |||
| 153c8cf8f7 | |||
| be45cbcf9e | |||
| 853cc64dff | |||
| 7e81742862 |
+69
-11
@@ -70,10 +70,9 @@ proper: repodel
|
||||
mockclean:
|
||||
$(MOCK) --clean --scrub=all
|
||||
|
||||
#help mockproper: Clean mock chroot and cache directories for this package.
|
||||
#help mockproper: Clean mock chroot
|
||||
mockproper:
|
||||
$(MOCK) --clean --scrub=all --uniqueext=$(PKG_NAME)
|
||||
$(MOCK) --clean --scrub=chroot --uniqueext=$(PKG_NAME)
|
||||
$(MOCK) --clean --uniqueext=$(PKG_NAME)
|
||||
|
||||
configemail:
|
||||
@test -d .git || git init
|
||||
@@ -144,6 +143,10 @@ pullrebase:
|
||||
echo "No commits exist in remote. Continuing."; \
|
||||
exit 0; \
|
||||
fi; \
|
||||
if [ "$$(git rev-list FETCH_HEAD | head -n 1)" = "$$(git rev-list HEAD | head -n 1)" ]; then \
|
||||
echo "Current branch up-to-date. Continuing."; \
|
||||
exit 0; \
|
||||
fi; \
|
||||
echo "Rebasing to origin/master"; \
|
||||
if git status --porcelain | grep -q '^.[^?]'; \
|
||||
then \
|
||||
@@ -187,6 +190,19 @@ autospec: preautospec-checks pullrebase localreponotice clean-old-content
|
||||
bash update_changelog.sh ; \
|
||||
git commit --amend --no-edit Change* ; \
|
||||
fi
|
||||
@$(MAKE) -s for-review.txt
|
||||
diffstat for-review.txt
|
||||
@printf "\n**\n"
|
||||
@printf "** NOTICE: A patch with changes is available in the file for-review.txt\n"
|
||||
@printf "** To recreate (e.g., after git commit --amend), run make for-review.txt\n"
|
||||
@printf "** To submit for review: git send-email --to <recipient> for-review.txt\n"
|
||||
@printf "**\n\n"
|
||||
|
||||
#help for-review.txt: Creates the for-review.txt file, which is
|
||||
#help a minimized version of the Git commit, suitable for code review.
|
||||
for-review.txt:
|
||||
git diff | grep -q index || python3 $(TOPLVL)/projects/common/patchfilter.py > for-review.txt
|
||||
.PHONY: for-review.txt
|
||||
|
||||
#help autospecnogit: Runs autospec, but does not create a commit
|
||||
autospecnogit:
|
||||
@@ -268,6 +284,7 @@ sources:
|
||||
@$(MAKE) generateupstream; \
|
||||
[ $$? -eq 0 ] && exit 0; \
|
||||
nvr="$$(rpmspec --srpm -q --qf '%{NAME}\t%{VERSION}\t%{RELEASE}\n' $(SPECFILE))"; \
|
||||
git -C $(TOPLVL)/projects/common fetch --tags >/dev/null 2>&1; \
|
||||
latest_builds=$$(git -C $(TOPLVL)/projects/common tag -l | sort -rn); \
|
||||
for b in $$latest_builds; do \
|
||||
url="$(DOWNLOAD_MIRROR)/releases/$$b/clear/source/package-sources"; \
|
||||
@@ -319,7 +336,7 @@ scratch: $(SPECFILE) upstream $(SRPMFILE) kojidef
|
||||
|
||||
#help scratch-wait: Performs scratch-build on package.
|
||||
scratch-wait: $(SPECFILE) upstream $(SRPMFILE) kojidef
|
||||
$(KOJI_CMD) build --scratch $(KOJI_TAG) $(SRPMFILE)
|
||||
$(KOJI_CMD) build --scratch --wait $(KOJI_TAG) $(SRPMFILE)
|
||||
|
||||
#help koji-nowait: Same as 'make koji', but do not block
|
||||
koji-nowait:
|
||||
@@ -361,6 +378,28 @@ repoadd: $(TOPLVL)/repo
|
||||
$(MAKE) localrepocreate
|
||||
$(call localrepoenable,${PM_CONF},${MOCK_CONF})
|
||||
|
||||
#help repostage: Stages locally-built RPMs for this package to the local RPM
|
||||
#help directory. If this directory does not yet exist, it is created and
|
||||
#help enabled.
|
||||
repostage: $(TOPLVL)/repo
|
||||
@if [ -z "${LATEST_RPMS}" ]; then \
|
||||
echo "No rpms found in rpms/ directory."; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
if [ -f .repo-index ]; then \
|
||||
echo "Cleaning old rpms:"; \
|
||||
for r in `cat .repo-index`; do \
|
||||
echo "-$$r"; \
|
||||
rm -f $(TOPLVL)/repo/$$r; \
|
||||
done; \
|
||||
rm .repo-index; \
|
||||
fi; \
|
||||
for r in ${LATEST_RPMS}; do \
|
||||
echo "+$$r"; \
|
||||
echo $$(basename $$r) >> .repo-index; \
|
||||
ln -f $$r $(TOPLVL)/repo/; \
|
||||
done
|
||||
|
||||
#help repodel: Removes RPMs from the local RPM repository that were
|
||||
#help previously added by 'make repoadd' for this package.
|
||||
repodel:
|
||||
@@ -412,27 +451,43 @@ install:
|
||||
#help install-debuginfo-local: Install locally built debuginfo RPM to
|
||||
#help the automatic debuginfo cache location (/var/cache/debuginfo)
|
||||
install-debuginfo-local:
|
||||
@if [ -z "${DEBUGINFO_RPM}" ]; then \
|
||||
echo "No debuginfo to install... skipping"; \
|
||||
exit 0; \
|
||||
fi; \
|
||||
echo -n "Installing ${DEBUGINFO_RPM}... "; \
|
||||
tmpdir=$$(mktemp -d); \
|
||||
rpm2cpio ${DEBUGINFO_RPM} | ( cd $$tmpdir; cpio -i -d -u); \
|
||||
rpm2cpio ${DEBUGINFO_RPM} | ( cd $$tmpdir; cpio -i -d -u 2> /dev/null); \
|
||||
dest=/var/cache/debuginfo/lib; \
|
||||
find $$tmpdir/usr/lib/debug/ -mindepth 1 -maxdepth 1 | while read -r d; do \
|
||||
find $$tmpdir/usr/lib/debug/ -mindepth 1 -maxdepth 1 2> /dev/null | while read -r d; do \
|
||||
sudo chown -R dbginfo:dbginfo "$$d"; \
|
||||
sudo cp -a "$$d" $$dest/; \
|
||||
done; \
|
||||
find $$tmpdir/usr/share/debug/ -mindepth 1 -maxdepth 1 -regextype awk -regex '.*/(.build-id|boot|lib|sbin|usr)$$' 2> /dev/null | while read -r d; do \
|
||||
sudo chown -R dbginfo:dbginfo "$$d"; \
|
||||
sudo cp -a "$$d" $$dest/; \
|
||||
done; \
|
||||
dest=/var/cache/debuginfo/src; \
|
||||
find $$tmpdir/usr/src/debug/ -mindepth 1 -maxdepth 1 | while read -r d; do \
|
||||
find $$tmpdir/usr/src/debug/ -mindepth 1 -maxdepth 1 2> /dev/null | while read -r d; do \
|
||||
sudo chown -R dbginfo:dbginfo "$$d"; \
|
||||
sudo cp -a "$$d" $$dest/; \
|
||||
done; \
|
||||
sudo rm -rf $$tmpdir
|
||||
find $$tmpdir/usr/share/debug/src/ -mindepth 1 -maxdepth 1 2> /dev/null | while read -r d; do \
|
||||
sudo chown -R dbginfo:dbginfo "$$d"; \
|
||||
sudo cp -a "$$d" $$dest/; \
|
||||
done; \
|
||||
sudo rm -rf $$tmpdir; \
|
||||
echo "done"
|
||||
|
||||
#help install-local: Install locally built RPMs to the root filesystem. Note that the
|
||||
#help debuginfo RPM installs to /var/cache/debuginfo
|
||||
install-local:
|
||||
for r in $(filter-out ${DEBUGINFO_RPM},${RPMS}); do \
|
||||
rpm2cpio $$r | (cd /; sudo cpio -i -d -u); \
|
||||
@for r in $(filter-out ${DEBUGINFO_RPM},${RPMS}); do \
|
||||
echo -n "Installing $$r... "; \
|
||||
rpm2cpio $$r | (cd /; sudo cpio -i -d -u 2> /dev/null); \
|
||||
echo "done"; \
|
||||
done
|
||||
$(MAKE) install-debuginfo-local
|
||||
@$(MAKE) -s install-debuginfo-local
|
||||
|
||||
#help install-mock: Install locally built RPMs to the mock rootcache
|
||||
#help filesystem. This command is usually used with "make shell".
|
||||
@@ -475,6 +530,9 @@ cloc: $(SRPMFILE)
|
||||
@$(MOCK) --clean --scrub=chroot --uniqueext=$(PKG_NAME)
|
||||
cat results/cloc.txt
|
||||
|
||||
# Define LTS-specific targets in a separate makefile
|
||||
-include $(TOPLVL)/projects/common/Makefile.common.lts
|
||||
|
||||
# Define site local common targets in a separate makefile
|
||||
-include $(TOPLVL)/projects/common/Makefile.common.site_local
|
||||
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
#-*-makefile-*-
|
||||
|
||||
LTSUTILS = python $(TOPLVL)/projects/common/lts/main.py $(PKG_NAME)
|
||||
|
||||
#help lts-show: Display a summary of active LTS branches.
|
||||
lts-show:
|
||||
@$(LTSUTILS) sanity-check
|
||||
@while read b; do \
|
||||
if git show-ref $$b > /dev/null; then \
|
||||
echo $$b $$(git log --oneline -1 $$b); \
|
||||
else \
|
||||
echo $$b Not found; \
|
||||
fi; \
|
||||
done < $(TOPLVL)/projects/common/lts/active-branches
|
||||
|
||||
#help lts-backport: Fast-forward the previous active branch to the current
|
||||
#help branch.
|
||||
lts-backport:
|
||||
@$(LTSUTILS) sanity-check
|
||||
@newer=$$(git symbolic-ref HEAD); \
|
||||
newer=$${newer#refs/heads/}; \
|
||||
if ! $(LTSUTILS) prev-branch --checkout; then \
|
||||
echo Could not check out previous active branch.; \
|
||||
exit 0; \
|
||||
fi; \
|
||||
if $(LTSUTILS) is-same-version $$newer; then \
|
||||
$(LTSUTILS) fast-forward $$newer; \
|
||||
else \
|
||||
echo Most likely a patch needs to be manually re-applied for this version.; \
|
||||
echo Alternatively, use \"git merge --ff-only $$newer\" to upgrade the package version.; \
|
||||
fi
|
||||
|
||||
#help lts-build: Build RPM in Koji, or reuse existing build from older LTS
|
||||
#help branch.
|
||||
lts-build:
|
||||
@$(LTSUTILS) sanity-check
|
||||
@tag=$$(git tag --points-at); \
|
||||
if [[ -z $$tag ]]; then \
|
||||
echo This commit does not have a tag.; \
|
||||
echo Proceeding to run \"make lts-koji\".; \
|
||||
$(LTSUTILS) prompt || exit; \
|
||||
$(MAKE) lts-koji; \
|
||||
exit; \
|
||||
fi; \
|
||||
older=$$($(LTSUTILS) prev-branch); \
|
||||
if [[ -z $$older ]]; then \
|
||||
echo Could not determine previous active branch.; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
current=$$($(LTSUTILS) current-branch); \
|
||||
if [[ $$(git rev-parse $$older) != $$(git rev-parse $$current) ]]; then \
|
||||
echo Previous branch and current branch have different commits.; \
|
||||
for b in $$older $$current; do echo $$b $$(git log --oneline -1 $$b); done; \
|
||||
echo Proceeding to run \"make lts-koji\".; \
|
||||
$(LTSUTILS) prompt || exit; \
|
||||
$(MAKE) lts-koji; \
|
||||
exit; \
|
||||
fi; \
|
||||
if $(LTSUTILS) can-reuse-binary $$older; then \
|
||||
echo Reusing binary from $$older.; \
|
||||
$(KOJI_CMD) tag-build $$current $(SRPMVERS); \
|
||||
else \
|
||||
echo Could not reuse binary from $$older.; \
|
||||
echo Proceeding to run \"make bump lts-koji\".; \
|
||||
$(LTSUTILS) prompt || exit; \
|
||||
$(MAKE) bump lts-koji; \
|
||||
fi
|
||||
@$(LTSUTILS) next-branch --checkout
|
||||
|
||||
#help lts-koji: Same as "koji" but for working on LTS branches. Should not
|
||||
#help be called directly, use lts-build instead.
|
||||
lts-koji: prekoji-checks kojidef
|
||||
@$(LTSUTILS) sanity-check
|
||||
@$(MAKE) spdxcheck
|
||||
@$(MAKE) checkblacklist
|
||||
@current=$$($(LTSUTILS) current-branch); \
|
||||
if ! grep $$current $(TOPLVL)/projects/common/lts/active-branches; then \
|
||||
echo "Error: Must be on an active branch to submit to koji" >&2; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
if ! git diff --quiet HEAD ${SPECFILE}; then \
|
||||
echo "Error: All changes to ${SPECFILE} must be committed first" >&2; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
if git rev-parse --verify --quiet origin/$$current > /dev/null; then \
|
||||
git pull --rebase; \
|
||||
fi
|
||||
git tag $(SRPMVERS)-lts
|
||||
git push origin $$($(LTSUTILS) current-branch) refs/tags/$(SRPMVERS)-lts
|
||||
$(KOJI_CMD) build $$KOJI_NOWAIT $$($(LTSUTILS) current-branch) $(PKG_BASE_URL)/$(PKG_NAME)?#$(SRPMVERS)-lts
|
||||
+61
-7
@@ -11,6 +11,7 @@ SHELL = /bin/bash
|
||||
|
||||
PKGS = $(shell cat $(PACKAGES_FILE))
|
||||
PKGS_LOCAL = $(sort $(filter ${PKGS},$(subst packages/,,$(wildcard packages/*))))
|
||||
PKGS_ORPHANED = $(sort $(filter-out common ${PKGS},$(subst packages/,,$(wildcard packages/*))))
|
||||
|
||||
proj_PKGS = $(addprefix proj_,$(PROJ_PKGS))
|
||||
clone_PKGS = $(addprefix clone_,$(PKGS))
|
||||
@@ -128,11 +129,9 @@ pull: ${PULL_PKGS}
|
||||
#help clean-pkgs-dir: For packages that are no longer present in the distro,
|
||||
#help removes the associated package repos from the ./packages tree
|
||||
clean-pkgs-dir: $(PACKAGES_FILE)
|
||||
@for p in `ls packages`; do \
|
||||
if ! grep -wq "^$$p$$" "$<" && [ "$$p" != common ]; then \
|
||||
echo "Removing $$p from packages, it is no longer in common/packages."; \
|
||||
rm -rf packages/$$p; \
|
||||
fi \
|
||||
@for p in ${PKGS_ORPHANED}; do \
|
||||
echo "Removing $$p from packages, it is no longer in common/packages."; \
|
||||
rm -rf packages/$$p; \
|
||||
done
|
||||
@echo "packages directory cleaned";
|
||||
|
||||
@@ -226,8 +225,63 @@ autospecnew: preautospecnew-checks localreponotice
|
||||
$${SETVERSION:+ --version $${SETVERSION}} \
|
||||
${NON_INTERACTIVE} ${SKIP_GIT} ${CLEANUP} \
|
||||
$(URL); \
|
||||
[ $$? -eq 0 ] && $(MAKE) link-new-rpms PKG_REPO_DIR="${TOPLVL}/packages/${NAME}"; \
|
||||
$(TOPLVL)/projects/common/checkblacklist.sh $(TOPLVL)/projects/common/blacklist $(TOPLVL)/packages/${NAME}/results/*.rpm; \
|
||||
if [ $$? -eq 0 ]; then \
|
||||
$(MAKE) link-new-rpms PKG_REPO_DIR="${TOPLVL}/packages/${NAME}"; \
|
||||
$(TOPLVL)/projects/common/checkblacklist.sh $(TOPLVL)/projects/common/blacklist $(TOPLVL)/packages/${NAME}/results/*.rpm; \
|
||||
python3 $(TOPLVL)/projects/common/patchfilter.py <(git -C $(TOPLVL)/packages/$(NAME) format-patch -1 --stdout) > $(TOPLVL)/packages/$(NAME)/for-review.txt; \
|
||||
printf "\n**\n"; \
|
||||
printf "** NOTICE: A patch with changes is available in the file $(TOPLVL)/packages/$(NAME)/for-review.txt\n"; \
|
||||
printf "** Please look through this file and if you are unsure, please submit for code review with git send-email\n"; \
|
||||
printf "**\n\n"; \
|
||||
else \
|
||||
echo "Autospec of $(NAME) failed."; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
else \
|
||||
echo "$(NAME) already exists at $(TOPLVL)/packages/$(NAME)"; \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
#help autospecnewgo: Creates a new autospec package with (dependencies)
|
||||
#help for a given URL=$(URL) with NAME=$(NAME). Several files used by
|
||||
#help autospec will be created in the help process.
|
||||
#help Use MOCK_OPTS environment varible to pass down arbitrary mock options
|
||||
#help to autospec.
|
||||
#help For more information about autospec, see the project page on Github https://github.com/clearlinux/autospec
|
||||
autospecnewgo: preautospecnew-checks localreponotice
|
||||
@if [ -z $(NAME) ] || [ -z $(URL) ]; then \
|
||||
echo "Please specify NAME and URL. The ARCHIVES variable is optional."; \
|
||||
exit 1; \
|
||||
fi
|
||||
-$(MAKE) clone_$(NAME)
|
||||
@if [ ! -d $(TOPLVL)/packages/$(NAME)/.git ]; then \
|
||||
echo "no remote repository found, creating new package repository and running autospec"; \
|
||||
mkdir -p $(TOPLVL)/packages/$(NAME); \
|
||||
( \
|
||||
cd $(TOPLVL)/packages/$(NAME); \
|
||||
git init; \
|
||||
git remote add origin $(PKG_BASE_URL)/$(NAME); \
|
||||
$(call gitoliteurl,packages/$(NAME)); \
|
||||
$(call subjectprefix,$(NAME)); \
|
||||
); \
|
||||
printf 'PKG_NAME := %s\nURL = %s\nARCHIVES = %s\n\ninclude ../common/Makefile.common\n' $(NAME) '$(value URL)' '$(value ARCHIVES)' > $(TOPLVL)/packages/$(NAME)/Makefile; \
|
||||
python3 $(TOPLVL)/projects/common/go-builder.py \
|
||||
--target packages/$(NAME) \
|
||||
--integrity \
|
||||
--config "$(AUTOSPEC_CONF)" \
|
||||
--name $(NAME) \
|
||||
--archives $(ARCHIVES) \
|
||||
--mock-config $(MOCK_CONFIG_VAL) \
|
||||
--mock-opts "$(MOCK_OPTS)" \
|
||||
$(URL); \
|
||||
if [ $$? -eq 0 ]; then \
|
||||
$(MAKE) link-new-rpms PKG_REPO_DIR="${TOPLVL}/packages/${NAME}"; \
|
||||
$(TOPLVL)/projects/common/checkblacklist.sh $(TOPLVL)/projects/common/blacklist $(TOPLVL)/packages/${NAME}/results/*.rpm; \
|
||||
python3 $(TOPLVL)/projects/common/patchfilter.py <(git -C $(TOPLVL)/packages/$(NAME) show) > $(TOPLVL)/packages/$(NAME)/for-review.txt; \
|
||||
python3 $(TOPLVL)/projects/common/patchfilter.py <(git -C $(TOPLVL)/packages/$(NAME) show); \
|
||||
else \
|
||||
exit 1; \
|
||||
fi; \
|
||||
else \
|
||||
echo "$(NAME) already exists at $(TOPLVL)/packages/$(NAME)"; \
|
||||
exit 1; \
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,40 @@
|
||||
## Advanced topics
|
||||
|
||||
### Manual setup
|
||||
|
||||
If you did not run the user-setup script (see "Automated setup" section in the
|
||||
[main README](README.md), you will want to set up the developer tooling
|
||||
workspace manually. This section provides general documentation for the manual
|
||||
setup process, and it is not meant to be exhaustive.
|
||||
|
||||
On your Clear Linux system, create a workspace for Clear Linux development
|
||||
work:
|
||||
|
||||
```
|
||||
$ mkdir clearlinux
|
||||
```
|
||||
|
||||
Clone this repo into a `projects` directory within the workspace:
|
||||
|
||||
```
|
||||
$ cd clearlinux
|
||||
$ mkdir projects
|
||||
$ git clone https://github.com/clearlinux/common projects/common
|
||||
```
|
||||
|
||||
Create the toplevel tooling Makefile:
|
||||
|
||||
```
|
||||
$ ln -s projects/common/Makefile.toplevel Makefile
|
||||
```
|
||||
|
||||
Clone all Clear Linux package and project repositories:
|
||||
|
||||
```
|
||||
$ make clone
|
||||
```
|
||||
|
||||
Note: You can clone the repos in parallel by using make's `-j` option.
|
||||
|
||||
At this point, the `packages` directory will contain all Clear Linux package
|
||||
repos, and `projects` will contain common, clr-bundles, and autospec repos.
|
||||
@@ -152,39 +152,4 @@ If `Makefile.config.site_local` doesn't exist already, create it.
|
||||
|
||||
### Manual setup
|
||||
|
||||
If you did not run the user-setup script (see "Automated setup" section above),
|
||||
you will want to set up the developer tooling workspace manually. This section
|
||||
provides general documentation for the manual setup process, and it is not
|
||||
meant to be exhaustive.
|
||||
|
||||
On your Clear Linux system, create a workspace for Clear Linux development
|
||||
work:
|
||||
|
||||
```
|
||||
$ mkdir clearlinux
|
||||
```
|
||||
|
||||
Clone this repo into a `projects` directory within the workspace:
|
||||
|
||||
```
|
||||
$ cd clearlinux
|
||||
$ mkdir projects
|
||||
$ git clone https://github.com/clearlinux/common projects/common
|
||||
```
|
||||
|
||||
Create the toplevel tooling Makefile:
|
||||
|
||||
```
|
||||
$ ln -s projects/common/Makefile.toplevel Makefile
|
||||
```
|
||||
|
||||
Clone all Clear Linux package and project repositories:
|
||||
|
||||
```
|
||||
$ make clone
|
||||
```
|
||||
|
||||
Note: You can clone the repos in parallel by using make's `-j` option.
|
||||
|
||||
At this point, the `packages` directory will contain all Clear Linux package
|
||||
repos, and `projects` will contain common, clr-bundles, and autospec repos.
|
||||
See the [Manual setup](README-advanced.md#manual-setup) documentation.
|
||||
|
||||
Executable
+285
@@ -0,0 +1,285 @@
|
||||
#!/usr/bin/env python3
|
||||
#
|
||||
# gowrap.py - part of autospec
|
||||
# Copyright (C) 2019 Intel Corporation
|
||||
#
|
||||
# This program 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.
|
||||
#
|
||||
# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
|
||||
def parse_args():
|
||||
"""Parse commandline arguments."""
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("url", help="Location of package archive")
|
||||
parser.add_argument("-t", "--target", dest="target", action="store",
|
||||
default=None,
|
||||
help="Target location to create or reuse")
|
||||
parser.add_argument("-c", "--config", dest="config", action="store",
|
||||
default="/usr/share/defaults/autospec/autospec.conf",
|
||||
help="Set configuration file to use")
|
||||
parser.add_argument("-n", "--name", action="store", dest="name", default="",
|
||||
help="Override the package name")
|
||||
parser.add_argument("-i", "--integrity", action="store_true",
|
||||
default=False,
|
||||
help="Search for package signature from source URL and "
|
||||
"attempt to verify package")
|
||||
parser.add_argument("-m", "--mock-config", action="store", default="clear",
|
||||
help="Value to pass with Mock's -r option. Defaults to "
|
||||
"\"clear\", meaning that Mock will use "
|
||||
"/etc/mock/clear.cfg.")
|
||||
parser.add_argument("-o", "--mock-opts", action="store", default="",
|
||||
help="Arbitrary options to pass down to mock when "
|
||||
"building a package.")
|
||||
parser.add_argument('-a', "--archives", action="store",
|
||||
dest="archives", default=[], nargs='*',
|
||||
help="tarball URLs for additional source archives and"
|
||||
" a location for the sources to be extacted to (e.g."
|
||||
" http://example.com/downloads/dependency.tar.gz"
|
||||
" /directory/relative/to/extract/root )")
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def missing_dependencies(name):
|
||||
"""Check if the build failed due to missing dependencies."""
|
||||
root_log = os.path.join("packages", name, "results", "root.log")
|
||||
if not os.path.exists(root_log):
|
||||
return False
|
||||
with open(root_log, "r") as lfile:
|
||||
for line in lfile.readlines():
|
||||
if "No matching package to install" in line:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def already_built(name, version):
|
||||
"""Check if the package and version are already built."""
|
||||
if not os.path.exists(os.path.join("packages", name, "rpms")):
|
||||
return False
|
||||
vpath = os.path.join("packages", name, "versions")
|
||||
if not os.path.exists(vpath):
|
||||
return False
|
||||
with open(vpath, "r") as vfile:
|
||||
if version not in [x.strip() for x in vfile.readlines()]:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def build(path, args, name, url, version):
|
||||
"""Try and build a package."""
|
||||
if version:
|
||||
ver_arg = ["-v", version]
|
||||
else:
|
||||
ver_arg = []
|
||||
if already_built(name, version):
|
||||
return True
|
||||
print(f"Trying to autospec {name} - {version}")
|
||||
|
||||
proc = subprocess.run(["python3",
|
||||
f"{path}/../autospec/autospec/autospec.py", url,
|
||||
"-c", args.config, "-t", f"packages/{name}",
|
||||
"-n", name, "-m", args.mock_config,
|
||||
"-o", args.mock_opts, "-i"] + ver_arg, capture_output=True)
|
||||
if proc.returncode == 0:
|
||||
subprocess.run(["make", "link-new-rpms", f"PKG_REPO_DIR=packages/{name}"],
|
||||
capture_output=True)
|
||||
return proc.returncode == 0
|
||||
|
||||
|
||||
def parse_go_mod(path):
|
||||
"""Parse go.mod file for build requirements.
|
||||
|
||||
File content looks as follows:
|
||||
|
||||
module example.com/foo/bar
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v0.3.1
|
||||
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999
|
||||
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||
"github.com/spf13/cobra" v0.0.3
|
||||
github.com/spf13/pflag v1.0.3 // indirect
|
||||
)
|
||||
|
||||
Need to handle all require lines including //indirect.
|
||||
Skip requires that use .git for now. May need to be handled
|
||||
differently.
|
||||
"""
|
||||
reqs = []
|
||||
with open(path, "r") as gfile:
|
||||
dep_start = False
|
||||
for line in gfile.readlines():
|
||||
# Ideally the mod file is generated and the format is
|
||||
# always correct but add a few defenses just in case
|
||||
line = line.strip()
|
||||
if line.startswith("//"):
|
||||
# Skip comments
|
||||
continue
|
||||
if dep_start:
|
||||
# End of the require section
|
||||
if line.startswith(")"):
|
||||
break
|
||||
req = line.split()[:2]
|
||||
req[0] = req[0].replace('"', '')
|
||||
if req[0].endswith(".git"):
|
||||
continue
|
||||
reqs.append(req)
|
||||
continue
|
||||
if line.startswith("require ("):
|
||||
dep_start = True
|
||||
return reqs
|
||||
|
||||
|
||||
def get_dependencies(name):
|
||||
"""Return path to the go.mod file if it exists."""
|
||||
command = None
|
||||
path = None
|
||||
pdir = os.path.join("packages", name)
|
||||
reqs = []
|
||||
for fname in os.listdir(pdir):
|
||||
# Find the archive
|
||||
if fname.endswith("zip"):
|
||||
command = ["unzip", fname]
|
||||
elif ".tar." in fname:
|
||||
command = ["tar", "xf", fname]
|
||||
else:
|
||||
command = None
|
||||
|
||||
if command:
|
||||
# Decompress archive
|
||||
tdir = tempfile.mkdtemp()
|
||||
tfile = os.path.join(tdir, fname)
|
||||
shutil.copyfile(os.path.join(pdir, fname), tfile)
|
||||
proc = subprocess.run(command, cwd=tdir, capture_output=True)
|
||||
if not proc.returncode:
|
||||
# inspect contents for a "go.sum" file
|
||||
for root, _, files in os.walk(tdir):
|
||||
if "go.mod" in files:
|
||||
path = f"{name}.gomod"
|
||||
shutil.copyfile(os.path.join(root, "go.mod"), path)
|
||||
reqs += parse_go_mod(path)
|
||||
os.unlink(path)
|
||||
shutil.rmtree(tdir)
|
||||
|
||||
return reqs
|
||||
|
||||
|
||||
def encode_requirements(requirement):
|
||||
"""Encode the project's module and version."""
|
||||
# Default dependency base proxy url
|
||||
base_url = "https://proxy.golang.org/"
|
||||
# Encoding based on
|
||||
# https://tip.golang.org/cmd/go/#hdr-Module_proxy_protocol
|
||||
encoded_module = ""
|
||||
for char in requirement[0]:
|
||||
if char.isupper():
|
||||
encoded_module += "!" + char.lower()
|
||||
else:
|
||||
encoded_module += char
|
||||
encoded_version = ""
|
||||
for char in requirement[1]:
|
||||
if char.isupper():
|
||||
encoded_version += "!" + char.lower()
|
||||
else:
|
||||
encoded_version += char
|
||||
return (encoded_module, encoded_version)
|
||||
|
||||
|
||||
def initialize_package(name, url, version, path, args):
|
||||
"""Setup package and try to build it."""
|
||||
if already_built(name, version):
|
||||
return True
|
||||
print(f"Trying to autospecnew {name} - {version}")
|
||||
|
||||
proc = subprocess.run(["make", "autospecnew", f"URL={url}", f"NAME={name}", f"SETVERSION={version}"], capture_output=True)
|
||||
if f"{name} already exists at" in proc.stdout.decode("utf-8"):
|
||||
return build(path, args, name, url, version)
|
||||
return proc.returncode == 0
|
||||
|
||||
|
||||
def build_recursive(path, args, name, url, version=None, success=None):
|
||||
"""Try and recursively build packages."""
|
||||
if not success:
|
||||
# First package being built, common utilities already run
|
||||
# so just use autospec directly
|
||||
success = {}
|
||||
ret = build(path, args, name, url, version)
|
||||
else:
|
||||
ret = initialize_package(name, url, version, path, args)
|
||||
|
||||
if ret:
|
||||
# Completed so we are done!
|
||||
return True
|
||||
|
||||
if not missing_dependencies(name):
|
||||
# Failed but not due to missing dependencies, bail
|
||||
print(f"Unknown error building {name} - {version}")
|
||||
return False
|
||||
|
||||
reqs = get_dependencies(name)
|
||||
if not reqs:
|
||||
# Didn't try and add anything so don't need to build again
|
||||
print(f"Build failed with no missing requirements: {name} - {version}")
|
||||
return False
|
||||
|
||||
print(f"First attempt to build failed due to missing dependencies {name} - {version}\n")
|
||||
for req in reqs:
|
||||
ereq = encode_requirements(req)
|
||||
rname = "go-" + req[0].replace("/", "-")
|
||||
rurl = f"https://proxy.golang.org/{ereq[0]}/@v/list"
|
||||
if (rname, req[1]) in success:
|
||||
# Rebuild detected, figure out if it is okay or not
|
||||
if success[(rname, req[1])]:
|
||||
# Already succeeded building req short circuit success
|
||||
continue
|
||||
else:
|
||||
# Encountered a build loop, bail out as this likely
|
||||
# requires manual fixing
|
||||
print(f"Detected build loop when building {rname} - {req[1]}")
|
||||
return True
|
||||
success[(rname, req[1])] = False
|
||||
if not build_recursive(path, args, rname, rurl, req[1], success):
|
||||
print(f"Failed to build dependency {rname} - {req[1]}")
|
||||
return False
|
||||
|
||||
success[(rname, req[1])] = True
|
||||
subprocess.run(["make", "repodel"], cwd=f"packages/{rname}", capture_output=True)
|
||||
subprocess.run(["make", "repostage"], cwd=f"packages/{rname}", capture_output=True)
|
||||
|
||||
# Create the repo with the new packages added
|
||||
subprocess.run(["make", "localrepocreate"], capture_output=True)
|
||||
# Retry previously failed build assuming dependencies got added
|
||||
print(f"Rebuilding after resolving dependencies {name} - {version}")
|
||||
ret = build(path, args, name, url, version)
|
||||
print("")
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def main():
|
||||
"""Start program execution."""
|
||||
args = parse_args()
|
||||
path = os.path.dirname(os.path.realpath(__file__))
|
||||
return build_recursive(path, args, args.name, args.url)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if not main():
|
||||
sys.exit(-1)
|
||||
print("\n\nBuild completed\n\n")
|
||||
@@ -46,6 +46,7 @@ BSD-3-Clause-LBNL
|
||||
BSD-3-Clause-No-Nuclear-License
|
||||
BSD-3-Clause-No-Nuclear-License-2014
|
||||
BSD-3-Clause-No-Nuclear-Warranty
|
||||
BSD-3-Clause-Open-MPI
|
||||
BSD-4-Clause
|
||||
BSD-4-Clause-UC
|
||||
BSD-Protection
|
||||
@@ -56,6 +57,7 @@ Barr
|
||||
Beerware
|
||||
BitTorrent-1.0
|
||||
BitTorrent-1.1
|
||||
BlueOak-1.0.0
|
||||
Borceux
|
||||
CATOSL-1.1
|
||||
CC-BY-1.0
|
||||
@@ -88,6 +90,7 @@ CC-BY-SA-2.0
|
||||
CC-BY-SA-2.5
|
||||
CC-BY-SA-3.0
|
||||
CC-BY-SA-4.0
|
||||
CC-PDDC
|
||||
CC0-1.0
|
||||
CDDL-1.0
|
||||
CDDL-1.1
|
||||
@@ -99,6 +102,8 @@ CECILL-2.0
|
||||
CECILL-2.1
|
||||
CECILL-B
|
||||
CECILL-C
|
||||
CERN-OHL-1.1
|
||||
CERN-OHL-1.2
|
||||
CNRI-Jython
|
||||
CNRI-Python
|
||||
CNRI-Python-GPL-Compatible
|
||||
@@ -183,6 +188,7 @@ Info-ZIP
|
||||
Intel
|
||||
Intel-ACPI
|
||||
Interbase-1.0
|
||||
JPNIC
|
||||
JSON
|
||||
JasPer-2.0
|
||||
LAL-1.2
|
||||
@@ -290,6 +296,7 @@ OpenSSL
|
||||
PDDL-1.0
|
||||
PHP-3.0
|
||||
PHP-3.01
|
||||
Parity-6.0.0
|
||||
Plexus
|
||||
PostgreSQL
|
||||
Python-2.0
|
||||
@@ -308,12 +315,15 @@ SCEA
|
||||
SGI-B-1.0
|
||||
SGI-B-1.1
|
||||
SGI-B-2.0
|
||||
SHL-0.5
|
||||
SHL-0.51
|
||||
SISSL
|
||||
SISSL-1.2
|
||||
SMLNJ
|
||||
SMPPL
|
||||
SNIA
|
||||
SPL-1.0
|
||||
SSPL-1.0
|
||||
SWL
|
||||
Saxpath
|
||||
Sendmail
|
||||
@@ -325,6 +335,7 @@ Spencer-94
|
||||
Spencer-99
|
||||
StandardML-NJ
|
||||
SugarCRM-1.1.3
|
||||
TAPR-OHL-1.0
|
||||
TCL
|
||||
TCP-wrappers
|
||||
TMate
|
||||
@@ -361,6 +372,7 @@ Zend-2.0
|
||||
Zimbra-1.3
|
||||
Zimbra-1.4
|
||||
Zlib
|
||||
blessing
|
||||
bzip2-1.0.5
|
||||
bzip2-1.0.6
|
||||
copyleft-next-0.3.0
|
||||
@@ -373,6 +385,7 @@ eGenix
|
||||
gSOAP-1.3b
|
||||
gnuplot
|
||||
iMatix
|
||||
libpng-2.0
|
||||
libtiff
|
||||
mpich2
|
||||
psfrag
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
TEST = test.test_ltsutils
|
||||
|
||||
.PHONY: test
|
||||
test:
|
||||
PYTHONPATH=. python -m unittest -v -k .Test $(TEST)
|
||||
@@ -0,0 +1,19 @@
|
||||
# LTS package maintenance utility
|
||||
|
||||
This tooling is designed to automate 2 main tasks that are part of
|
||||
the package maintenance workflow of Clear Linux LTS. These tasks are:
|
||||
- Back-porting of a patch (e.g. security fix) to older branches.
|
||||
- Building RPMs with the intent of sharing binaries of older LTS branches to
|
||||
newer branches whenever possible.
|
||||
|
||||
There should be no need to run this tool directly. Instead use the following
|
||||
targets defined in Makefile.common.lts:
|
||||
- lts-show: Show a summary of active LTS branches
|
||||
- lts-backport: Attempt to fast-forward the previous active branch to the current branch
|
||||
- lts-build: Build RPM in Koji, or reuse existing build from older branch
|
||||
|
||||
"Active" branches correspond to LTS releases that currently have support.
|
||||
They are listed in a flat file "active-branches" in "lts" directory, from
|
||||
oldest to newest. New entries are added by Clear Linux LTS developers as
|
||||
new releases become available, and entries removed as releases become
|
||||
obsolete.
|
||||
@@ -0,0 +1,52 @@
|
||||
import pathlib
|
||||
from subprocess import PIPE, CalledProcessError
|
||||
from .shell import Shell
|
||||
|
||||
class PackageRepo:
|
||||
'''Represents a package repository. Most methods are wrappers of git commands.'''
|
||||
class UnknownCurrentBranchException(Exception): pass
|
||||
class InvalidBranchException(Exception): pass
|
||||
|
||||
def __init__(self, name, path):
|
||||
self.name = name
|
||||
self.path = pathlib.Path(path)
|
||||
self.sh = Shell(self.path)
|
||||
|
||||
def getNVR(self, commit='HEAD'):
|
||||
with self.sh.popen(['git', 'show', '{}:{}.spec'.format(commit, self.name)], stdout=PIPE) as specfile:
|
||||
nvr = self.sh.run('rpmspec --srpm -q --queryformat %{NVR} /dev/stdin', stdin=specfile.stdout)
|
||||
return tuple(nvr.stdout.strip().rsplit('-', maxsplit=2))
|
||||
|
||||
def checkoutBranch(self, branch, allow_remote=False):
|
||||
# allow_remote=True allows checking out a new remote-tracking branch
|
||||
if not allow_remote and not self.hasBranch(branch):
|
||||
raise self.InvalidBranchException(branch)
|
||||
self.sh.run_args(['git', 'checkout', branch], capture_output=False)
|
||||
|
||||
def fastForwardBranch(self, old, new):
|
||||
self.checkoutBranch(old)
|
||||
if not self.hasBranch(new):
|
||||
raise self.InvalidBranchException(new)
|
||||
self.sh.run_args(['git', 'merge', '--ff-only', new], capture_output=False)
|
||||
|
||||
def getActiveBranches(self):
|
||||
toplvl = pathlib.Path(self.path) / '../..'
|
||||
common = toplvl / 'projects/common'
|
||||
active_branches = common / 'lts/active-branches'
|
||||
with active_branches.open() as f:
|
||||
return [line.rstrip() for line in f]
|
||||
|
||||
def getCurrentBranch(self):
|
||||
try:
|
||||
head = self.sh.run('git symbolic-ref HEAD').stdout.strip()
|
||||
except CalledProcessError:
|
||||
raise self.UnknownCurrentBranchException
|
||||
|
||||
refs_heads = 'refs/heads/'
|
||||
assert head.startswith(refs_heads)
|
||||
head = head[len(refs_heads):]
|
||||
return head
|
||||
|
||||
def hasBranch(self, branch):
|
||||
p = self.sh.run_args(['git', 'rev-parse', 'refs/heads/'+branch], check=False)
|
||||
return p.returncode == 0
|
||||
@@ -0,0 +1,27 @@
|
||||
import subprocess, shlex
|
||||
|
||||
class Shell:
|
||||
# Default options passed to subprocess.run. May be customized per-instance.
|
||||
cwd = None
|
||||
check = True
|
||||
capture_output = True
|
||||
text = True
|
||||
|
||||
def __init__(self, cwd=None):
|
||||
if cwd: self.cwd = cwd
|
||||
|
||||
def run_args(self, args, **kwargs):
|
||||
kwargs1 = {
|
||||
'check': self.check,
|
||||
'capture_output': self.capture_output,
|
||||
'text': self.text,
|
||||
'cwd': self.cwd
|
||||
}
|
||||
kwargs1.update(kwargs)
|
||||
return subprocess.run(args, **kwargs1)
|
||||
|
||||
def run(self, cmd, **kwargs):
|
||||
return self.run_args(shlex.split(cmd), **kwargs)
|
||||
|
||||
def popen(self, args, **kwargs):
|
||||
return subprocess.Popen(args, cwd=self.cwd, **kwargs)
|
||||
+161
@@ -0,0 +1,161 @@
|
||||
#!/usr/bin/python
|
||||
import sys,argparse
|
||||
|
||||
from ltsutils.package_repo import PackageRepo
|
||||
|
||||
def log(msg, **kwargs):
|
||||
print(msg, file=sys.stderr)
|
||||
|
||||
def init_parser():
|
||||
main = argparse.ArgumentParser()
|
||||
main.add_argument('package_name', nargs=1)
|
||||
subparsers = main.add_subparsers(dest='command', metavar='command', required=True)
|
||||
|
||||
# Package maintenance commands
|
||||
p = subparsers.add_parser('prev-branch',
|
||||
help='show previous branch')
|
||||
p.add_argument('--checkout', action='store_true', help='checkout the branch')
|
||||
p = subparsers.add_parser('next-branch',
|
||||
help='show next branch')
|
||||
p.add_argument('--checkout', action='store_true', help='checkout the branch')
|
||||
p = subparsers.add_parser('current-branch',
|
||||
help='show current branch')
|
||||
p = subparsers.add_parser('is-same-version',
|
||||
help='return true if package version is the same as the given branch')
|
||||
p.add_argument('branch', nargs=1)
|
||||
p = subparsers.add_parser('fast-forward',
|
||||
help='fast-forward current branch to a newer branch')
|
||||
p.add_argument('branch', nargs=1)
|
||||
|
||||
# RPM build commands
|
||||
p = subparsers.add_parser('can-reuse-binary',
|
||||
help='check if binary from another branch can be used in current branch')
|
||||
p.add_argument('branch', nargs=1)
|
||||
|
||||
# Other commands
|
||||
p = subparsers.add_parser('prompt',
|
||||
help='prompt user to continue and return appropriate exit code')
|
||||
p = subparsers.add_parser('sanity-check',
|
||||
help='run sanity checks for data consistency')
|
||||
|
||||
return main
|
||||
|
||||
def prev_branch(args, repo):
|
||||
active_branches = repo.getActiveBranches()
|
||||
current = repo.getCurrentBranch()
|
||||
|
||||
i = active_branches.index(current)
|
||||
if i == 0:
|
||||
log('Already on oldest active branch.')
|
||||
return False
|
||||
|
||||
prev = active_branches[i-1]
|
||||
print(prev)
|
||||
if args.checkout:
|
||||
repo.checkoutBranch(prev, allow_remote=True)
|
||||
|
||||
def next_branch(args, repo):
|
||||
active_branches = repo.getActiveBranches()
|
||||
current = repo.getCurrentBranch()
|
||||
|
||||
i = active_branches.index(current)
|
||||
if i == len(active_branches)-1:
|
||||
log('Already on newest active branch.')
|
||||
return False
|
||||
|
||||
next_ = active_branches[i+1]
|
||||
print(next_)
|
||||
if args.checkout:
|
||||
repo.checkoutBranch(next_, allow_remote=False)
|
||||
|
||||
def current_branch(args, repo):
|
||||
current = repo.getCurrentBranch()
|
||||
print(current)
|
||||
|
||||
def is_same_version(args, other):
|
||||
current = repo.getCurrentBranch()
|
||||
other = args.branch[0]
|
||||
assert repo.hasBranch(other), 'Branch %s not found' % other
|
||||
|
||||
v1, v2 = [repo.getNVR('refs/heads/'+b)[1] for b in (current, other)]
|
||||
if v1 != v2:
|
||||
log('Current version {} does not match version {} on branch {}'.format(v1, v2, other))
|
||||
return v1 == v2
|
||||
|
||||
def fast_forward(args, repo):
|
||||
current = repo.getCurrentBranch()
|
||||
newer = args.branch[0]
|
||||
|
||||
log('Fast-forwarding {} to {}'.format(current, newer))
|
||||
repo.fastForwardBranch(current, newer)
|
||||
|
||||
def sanity_check(args, repo):
|
||||
ok = True
|
||||
# HEAD must point to a branch
|
||||
try:
|
||||
current = repo.getCurrentBranch()
|
||||
except PackageRepo.UnknownCurrentBranchException:
|
||||
log('Unknown current branch. Has a branch been checked out?')
|
||||
current = None
|
||||
ok = False
|
||||
|
||||
# active-branches file must not be empty
|
||||
active_branches = repo.getActiveBranches()
|
||||
if not len(active_branches):
|
||||
log('No active branches defined. Is active-branches file empty?')
|
||||
ok = False
|
||||
# current branch must be an active branch
|
||||
elif current and current not in active_branches:
|
||||
log('%s is not an active LTS branch.' % current)
|
||||
ok = False
|
||||
|
||||
return ok
|
||||
|
||||
def can_reuse_binary(args, repo):
|
||||
# Just compare versions for now
|
||||
# TODO: ABI compatibility testing
|
||||
current = repo.getCurrentBranch()
|
||||
older = args.branch[0]
|
||||
v1, v2 = [repo.getNVR('refs/heads/'+b)[1] for b in (older, current)]
|
||||
return v1 == v2
|
||||
|
||||
def prompt(args, repo):
|
||||
import selectors
|
||||
timeout = 60
|
||||
|
||||
while True:
|
||||
print('Continue? (y/N): ', end='', flush=True)
|
||||
with selectors.DefaultSelector() as sel:
|
||||
sel.register(sys.stdin, selectors.EVENT_READ)
|
||||
events = sel.select(timeout)
|
||||
if not len(events):
|
||||
print('Timed out after {}s.'.format(timeout))
|
||||
return False
|
||||
else:
|
||||
s = sys.stdin.readline().rstrip('\n')
|
||||
if s in ('Y', 'y', 'N', 'n', ''):
|
||||
break
|
||||
|
||||
if s in ('Y', 'y'):
|
||||
return True
|
||||
else:
|
||||
print('Cancelled.')
|
||||
return False
|
||||
|
||||
if __name__=='__main__':
|
||||
args = init_parser().parse_args()
|
||||
repo = PackageRepo(args.package_name[0], '.')
|
||||
|
||||
commands = {
|
||||
'prev-branch': prev_branch,
|
||||
'next-branch': next_branch,
|
||||
'current-branch': current_branch,
|
||||
'is-same-version': is_same_version,
|
||||
'fast-forward': fast_forward,
|
||||
'can-reuse-binary': can_reuse_binary,
|
||||
'prompt': prompt,
|
||||
'sanity-check': sanity_check,
|
||||
}
|
||||
ret = commands[args.command](args, repo)
|
||||
if ret is not None:
|
||||
exit(0 if ret else 1)
|
||||
@@ -0,0 +1,97 @@
|
||||
import unittest
|
||||
import os, pathlib, tempfile, logging
|
||||
import subprocess, functools
|
||||
|
||||
from ltsutils.package_repo import PackageRepo
|
||||
import ltsutils.shell
|
||||
|
||||
run = functools.partial(subprocess.run, check=True)
|
||||
|
||||
class Package:
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.repo_url = 'https://github.com/clearlinux-pkgs/{}.git'.format(name)
|
||||
|
||||
class LTSUtilsTestCase(unittest.TestCase):
|
||||
toplvl = pathlib.Path('../../..')
|
||||
packages = toplvl / 'packages'
|
||||
|
||||
def cloneOrExtractRepo(self):
|
||||
tmpdir = pathlib.Path('/var/tmp/common-lts-test')
|
||||
tmpdir.mkdir(mode=0o700, exist_ok=True)
|
||||
tarball = tmpdir / '{}.tar.gz'.format(self.package.name)
|
||||
if tarball.exists():
|
||||
run(['tar', 'xf', tarball, '-C', self.workdir])
|
||||
else:
|
||||
run(['git', 'clone', self.package.repo_url, self.workdir])
|
||||
run(['tar', 'czf', tarball, '-C', self.workdir, '.'])
|
||||
|
||||
def setUp(self):
|
||||
self._tmpdir = tempfile.TemporaryDirectory(prefix='test-{}-'.format(self.package.name), dir=self.packages)
|
||||
self.workdir = pathlib.Path(self._tmpdir.name)
|
||||
self.cloneOrExtractRepo()
|
||||
self.repo = PackageRepo(self.package.name, self.workdir)
|
||||
|
||||
self._sh = ltsutils.shell.Shell(self.workdir)
|
||||
self._sh.capture_output = False
|
||||
|
||||
def sh(self, cmd):
|
||||
return self._sh.run(cmd)
|
||||
|
||||
def sh_stdout(self, cmd):
|
||||
return self._sh.run(cmd, capture_output=True).stdout.rstrip()
|
||||
|
||||
def tearDown(self):
|
||||
self._tmpdir.cleanup()
|
||||
|
||||
class PackageRepoTestCase(LTSUtilsTestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.L1 = self.package.L1
|
||||
self.L2 = self.package.L2
|
||||
self.sh('git branch L1 %s' % self.L1)
|
||||
self.sh('git branch L2 %s' % self.L2)
|
||||
|
||||
def testGetNVR(self):
|
||||
raise NotImplementedError
|
||||
|
||||
def testHasBranch(self):
|
||||
self.assertTrue(self.repo.hasBranch('L2'))
|
||||
self.assertFalse(self.repo.hasBranch('L3'))
|
||||
|
||||
def testCheckoutBranch(self):
|
||||
self.repo.checkoutBranch('L2')
|
||||
self.assertEqual(self.sh_stdout('git rev-parse HEAD'), self.L2)
|
||||
|
||||
self.assertRaises(PackageRepo.InvalidBranchException, self.repo.checkoutBranch, 'L3')
|
||||
|
||||
def testFastForward(self):
|
||||
self.repo.fastForwardBranch('L1', 'L2')
|
||||
self.assertEqual(self.sh_stdout('git rev-parse L1'), self.L2)
|
||||
self.assertEqual(self.sh_stdout('git rev-parse L2'), self.L2)
|
||||
|
||||
def testGetCurrentBranch(self):
|
||||
self.repo.checkoutBranch('L2')
|
||||
b = self.repo.getCurrentBranch()
|
||||
self.assertEqual(b, 'L2')
|
||||
|
||||
self.sh('git checkout --detach L2')
|
||||
self.assertRaises(PackageRepo.UnknownCurrentBranchException, self.repo.getCurrentBranch)
|
||||
|
||||
class TestNano(PackageRepoTestCase):
|
||||
package = Package('nano')
|
||||
package.L1 = '3dcfa09f5217eedf6ec7539af7e243655d3abdb6' # 3.2-54
|
||||
package.L2 = 'b8243dd54e8feb16a11474f848b8735f5591cf12' # 3.2-55
|
||||
|
||||
def testGetNVR(self):
|
||||
nvr = self.repo.getNVR(self.L2)
|
||||
self.assertEqual(nvr, ('nano', '3.2', '55'))
|
||||
|
||||
class TestMySQL_Python(PackageRepoTestCase):
|
||||
package = Package('MySQL-python')
|
||||
package.L1 = '386163d8fc9c857c7194c4e958374af4c4f071ed' # 1.2.5-31
|
||||
package.L2 = 'f85bc5ec2141384f45f224d4464a0a44a981a4d4' # 1.2.5-33
|
||||
|
||||
def testGetNVR(self):
|
||||
nvr = self.repo.getNVR(self.L2)
|
||||
self.assertEqual(nvr, ('MySQL-python', '1.2.5', '33'))
|
||||
+360
@@ -0,0 +1,360 @@
|
||||
#!/usr/bin/python3
|
||||
import sys
|
||||
import tempfile
|
||||
import subprocess
|
||||
|
||||
header = list()
|
||||
files = list()
|
||||
files_chunks = dict() # dict to list
|
||||
files_header = dict() # dict to list
|
||||
|
||||
|
||||
|
||||
def push_chunk(file, chunk):
|
||||
global files_chunks
|
||||
|
||||
if len(chunk) == 0:
|
||||
return
|
||||
|
||||
if file not in files_chunks:
|
||||
files_chunks[file] = list()
|
||||
|
||||
files_chunks[file].append(chunk)
|
||||
|
||||
|
||||
def parse_patch(lines):
|
||||
global header
|
||||
global files
|
||||
global files_chunks
|
||||
global files_header
|
||||
|
||||
phase = 0
|
||||
|
||||
currentfile = ""
|
||||
currentchunk = list()
|
||||
|
||||
|
||||
for line in lines:
|
||||
line = line.replace("\n","")
|
||||
|
||||
if line.startswith("diff --git"):
|
||||
|
||||
push_chunk(currentfile, currentchunk)
|
||||
currentchunk = list()
|
||||
|
||||
filename = line.replace("diff --git","")
|
||||
index= filename.find("b/")
|
||||
if index >= 0:
|
||||
filename = filename[index:].strip()
|
||||
currentfile = filename
|
||||
files.append(currentfile)
|
||||
phase = 1
|
||||
|
||||
if line.startswith("@@"):
|
||||
push_chunk(currentfile, currentchunk)
|
||||
currentchunk = list()
|
||||
phase = 2
|
||||
|
||||
|
||||
if phase == 0:
|
||||
header.append(line)
|
||||
if phase == 1:
|
||||
if currentfile not in files_header:
|
||||
files_header[currentfile] = list()
|
||||
files_header[currentfile].append(line)
|
||||
if phase == 2:
|
||||
currentchunk.append(line)
|
||||
|
||||
push_chunk(currentfile, currentchunk)
|
||||
currentchunk = list()
|
||||
|
||||
def print_all():
|
||||
global header
|
||||
global files
|
||||
global files_chunks
|
||||
global files_header
|
||||
|
||||
for line in header:
|
||||
print(line)
|
||||
for file in files:
|
||||
for line in files_header[file]:
|
||||
print(line)
|
||||
if file in files_chunks:
|
||||
for chunk in files_chunks[file]:
|
||||
for line in chunk:
|
||||
print(line)
|
||||
|
||||
|
||||
def zap_entire_file(filename):
|
||||
global header
|
||||
global files
|
||||
global files_chunks
|
||||
global files_header
|
||||
if filename in files:
|
||||
files.remove(filename)
|
||||
|
||||
def zap_entire_file_end(filename):
|
||||
global header
|
||||
global files
|
||||
global files_chunks
|
||||
global files_header
|
||||
for file in files:
|
||||
if file.endswith(filename):
|
||||
files.remove(file)
|
||||
|
||||
def zap_line_in_file(filename, match):
|
||||
global header
|
||||
global files
|
||||
global files_chunks
|
||||
global files_header
|
||||
for file in files:
|
||||
if file.endswith(filename):
|
||||
for chunk in files_chunks[filename]:
|
||||
to_delete = list()
|
||||
for line in chunk:
|
||||
if line == ("+" + match):
|
||||
to_delete.append(line)
|
||||
if line == ("-" + match):
|
||||
to_delete.append(line)
|
||||
for line in to_delete:
|
||||
chunk.remove(line)
|
||||
|
||||
|
||||
def zap_line_in_file_start(filename, match):
|
||||
global header
|
||||
global files
|
||||
global files_chunks
|
||||
global files_header
|
||||
|
||||
for file in files:
|
||||
if file.endswith(filename):
|
||||
for chunk in files_chunks[file]:
|
||||
to_remove = list()
|
||||
for line in chunk:
|
||||
if line.startswith("+" + match):
|
||||
to_remove.append(line)
|
||||
if line.startswith("-" + match):
|
||||
to_remove.append(line)
|
||||
for line in to_remove:
|
||||
chunk.remove(line)
|
||||
|
||||
def zap_plus_line_in_file(filename):
|
||||
global header
|
||||
global files
|
||||
global files_chunks
|
||||
global files_header
|
||||
|
||||
for file in files:
|
||||
if file.endswith(filename):
|
||||
for chunk in files_chunks[file]:
|
||||
to_remove = list()
|
||||
for line in chunk:
|
||||
if line.startswith("+"):
|
||||
to_remove.append(line)
|
||||
for line in to_remove:
|
||||
chunk.remove(line)
|
||||
|
||||
|
||||
|
||||
def chunk_empty(chunk):
|
||||
for line in chunk:
|
||||
if len(line) > 0 and line[0] == '+':
|
||||
return False
|
||||
return True
|
||||
|
||||
def zap_empty_chunks():
|
||||
global header
|
||||
global files
|
||||
global files_chunks
|
||||
global files_header
|
||||
files_to_remove = list()
|
||||
for file in files:
|
||||
if file not in files_chunks:
|
||||
files.remove(file)
|
||||
continue
|
||||
to_remove = list()
|
||||
for chunk in files_chunks[file]:
|
||||
if chunk_empty(chunk):
|
||||
to_remove.append(chunk)
|
||||
for c in to_remove:
|
||||
files_chunks[file].remove(c)
|
||||
if len(files_chunks[file]) == 0:
|
||||
files_to_remove.append(file)
|
||||
|
||||
for file in files_to_remove:
|
||||
files.remove(file)
|
||||
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
filename = sys.argv[1]
|
||||
|
||||
with open (filename, "r") as myfile:
|
||||
lines = myfile.readlines()
|
||||
else:
|
||||
output = subprocess.check_output("git format-patch -1 --stdout", shell=True).decode("latin-1")
|
||||
lines = output.split("\n")
|
||||
|
||||
parse_patch(lines)
|
||||
|
||||
zap_entire_file("b/release")
|
||||
zap_entire_file("b/buildreq_cache")
|
||||
zap_entire_file("b/.gitignore")
|
||||
zap_entire_file("b/upstream")
|
||||
zap_entire_file("b/NEWS")
|
||||
zap_entire_file("b/ChangeLog")
|
||||
zap_entire_file_end("xz.sig")
|
||||
zap_entire_file_end("gz.sig")
|
||||
zap_entire_file_end("bz2.sig")
|
||||
|
||||
zap_line_in_file("b/testresults", "Total : 0")
|
||||
zap_line_in_file("b/testresults", "Pass : 0")
|
||||
zap_line_in_file("b/testresults", "Fail : 0")
|
||||
zap_line_in_file("b/testresults", "XFail : 0")
|
||||
zap_line_in_file("b/testresults", "Skip : 0")
|
||||
|
||||
zap_line_in_file("b/requires_ban", "#FOO")
|
||||
zap_line_in_file("b/Makefile", "ARCHIVES = ")
|
||||
zap_line_in_file("b/Makefile", "include ../common/Makefile.common")
|
||||
zap_line_in_file("b/Makefile", "")
|
||||
|
||||
zap_line_in_file_start(".spec", "Release :")
|
||||
zap_line_in_file_start(".spec", "Source99 :")
|
||||
zap_line_in_file_start(".spec", "Source0 :")
|
||||
zap_line_in_file_start(".spec", "export SOURCE_DATE_EPOCH")
|
||||
zap_line_in_file_start(".spec", "export AR=gcc-ar")
|
||||
zap_line_in_file_start(".spec", "export RANLIB=gcc-ranlib")
|
||||
zap_line_in_file_start(".spec", "export NM=gcc-nm")
|
||||
zap_line_in_file_start(".spec", "export CFLAGS=\"$CFLAGS -O3 -ffat-lto-objects -flto=4 \"")
|
||||
zap_line_in_file_start(".spec", "export FCFLAGS=\"$CFLAGS -O3 -ffat-lto-objects -flto=4 \"")
|
||||
zap_line_in_file_start(".spec", "export FFLAGS=\"$CFLAGS -O3 -ffat-lto-objects -flto=4 \"")
|
||||
zap_line_in_file_start(".spec", "export CXXFLAGS=\"$CXXFLAGS -O3 -ffat-lto-objects -flto=4 \"")
|
||||
zap_line_in_file_start(".spec", "%setup -q -n ")
|
||||
zap_line_in_file_start(".spec", "URL :")
|
||||
zap_line_in_file_start(".spec", "Version :")
|
||||
zap_line_in_file_start(".spec", "Group : Development/Tools")
|
||||
zap_line_in_file_start(".spec", "No detailed description available")
|
||||
zap_line_in_file_start(".spec", "bin components for the")
|
||||
zap_line_in_file_start(".spec", "dev components for the")
|
||||
zap_line_in_file_start(".spec", "lib components for the")
|
||||
zap_line_in_file_start(".spec", "data components for the")
|
||||
zap_line_in_file_start(".spec", "locales components for the")
|
||||
zap_line_in_file_start(".spec", "license components for the")
|
||||
zap_line_in_file_start(".spec", "doc components for the")
|
||||
zap_line_in_file_start(".spec", "Group: Default")
|
||||
zap_line_in_file_start(".spec", "export http_proxy=http://127.0.0.1:9/")
|
||||
zap_line_in_file_start(".spec", "export https_proxy=http://127.0.0.1:9/")
|
||||
zap_line_in_file_start(".spec", "export ftp_proxy=http://127.0.0.1:9/")
|
||||
zap_line_in_file_start(".spec", "export no_proxy=localhost,127.0.0.1,0.0.0.0")
|
||||
zap_line_in_file_start(".spec", "Summary:")
|
||||
zap_line_in_file_start(".spec", "Group: Development")
|
||||
zap_line_in_file_start(".spec", "Group: Binaries")
|
||||
zap_line_in_file_start(".spec", "Group: Data")
|
||||
zap_line_in_file_start(".spec", "Group: Libraries")
|
||||
zap_line_in_file_start(".spec", "Group: Documentation")
|
||||
zap_line_in_file_start(".spec", "export LANG=C")
|
||||
zap_line_in_file_start(".spec", "%description lib")
|
||||
zap_line_in_file_start(".spec", "%description bin")
|
||||
zap_line_in_file_start(".spec", "%description data")
|
||||
zap_line_in_file_start(".spec", "%description doc")
|
||||
zap_line_in_file_start(".spec", "%description locales")
|
||||
zap_line_in_file_start(".spec", "%description dev")
|
||||
zap_line_in_file_start(".spec", "%description license")
|
||||
zap_line_in_file_start(".spec", "%package doc")
|
||||
zap_line_in_file_start(".spec", "cp -a ")
|
||||
|
||||
zap_line_in_file_start("b/Makefile", "URL =")
|
||||
zap_line_in_file_start("b/Makefile", "PKG_NAME :=")
|
||||
|
||||
zap_line_in_file("b/options.conf", "archives = ")
|
||||
zap_line_in_file("b/options.conf", "giturl = ")
|
||||
zap_line_in_file("b/options.conf", "[package]")
|
||||
zap_line_in_file("b/options.conf", "")
|
||||
zap_line_in_file("b/options.conf", "[autospec]")
|
||||
zap_line_in_file("b/options.conf", "# build 32 bit libraries")
|
||||
zap_line_in_file("b/options.conf", "32bit = false")
|
||||
zap_line_in_file("b/options.conf", "# allow package to build with test failures")
|
||||
zap_line_in_file("b/options.conf", "allow_test_failures = false")
|
||||
zap_line_in_file("b/options.conf", "# unset %build ld_as_needed variable")
|
||||
zap_line_in_file("b/options.conf", "asneeded = false")
|
||||
zap_line_in_file("b/options.conf", "# this package is trusted enough to automatically update (used by other tools)")
|
||||
zap_line_in_file("b/options.conf", "autoupdate = false")
|
||||
zap_line_in_file("b/options.conf", "# extend flags with '-std=gnu++98")
|
||||
zap_line_in_file("b/options.conf", "broken_c++ = false")
|
||||
zap_line_in_file("b/options.conf", "# disable parallelization during build")
|
||||
zap_line_in_file("b/options.conf", "broken_parallel_build = false")
|
||||
zap_line_in_file("b/options.conf", "# this package is a library compatability package and only ships versioned library files")
|
||||
zap_line_in_file("b/options.conf", "compat = false")
|
||||
zap_line_in_file("b/options.conf", "# set conservative build flags")
|
||||
zap_line_in_file("b/options.conf", "conservative_flags = false")
|
||||
zap_line_in_file("b/options.conf", "# dev package requires the extras to be installed")
|
||||
zap_line_in_file("b/options.conf", "dev_requires_extras = false")
|
||||
zap_line_in_file("b/options.conf", "# pass -ffast-math to compiler")
|
||||
zap_line_in_file("b/options.conf", "fast-math = false")
|
||||
zap_line_in_file("b/options.conf", "# optimize build for speed over size")
|
||||
zap_line_in_file("b/options.conf", "funroll-loops = false")
|
||||
zap_line_in_file("b/options.conf", "# set flags to smallest -02 flags possible")
|
||||
zap_line_in_file("b/options.conf", "insecure_build = false")
|
||||
zap_line_in_file("b/options.conf", "# do not remove static libraries")
|
||||
zap_line_in_file("b/options.conf", "keepstatic = false")
|
||||
zap_line_in_file("b/options.conf", "# do not require autostart subpackage")
|
||||
zap_line_in_file("b/options.conf", "no_autostart = false")
|
||||
zap_line_in_file("b/options.conf", "# disable stripping binaries")
|
||||
zap_line_in_file("b/options.conf", "nostrip = false")
|
||||
zap_line_in_file("b/options.conf", "# optimize build for size over speed")
|
||||
zap_line_in_file("b/options.conf", "optimize_size = false")
|
||||
zap_line_in_file("b/options.conf", "# set profile for pgo")
|
||||
zap_line_in_file("b/options.conf", "pgo = false")
|
||||
zap_line_in_file("b/options.conf", "# set flags for security-sensitive builds")
|
||||
zap_line_in_file("b/options.conf", "security_sensitive = false")
|
||||
zap_line_in_file("b/options.conf", "# do not run test suite")
|
||||
zap_line_in_file("b/options.conf", "skip_tests = false")
|
||||
zap_line_in_file("b/options.conf", "# add .so files to the lib package instead of dev")
|
||||
zap_line_in_file("b/options.conf", "so_to_lib = false")
|
||||
zap_line_in_file("b/options.conf", "# configure build for avx2")
|
||||
zap_line_in_file("b/options.conf", "use_avx2 = false")
|
||||
zap_line_in_file("b/options.conf", "# configure build for avx512")
|
||||
zap_line_in_file("b/options.conf", "use_avx512 = false")
|
||||
zap_line_in_file("b/options.conf", "# add clang flags")
|
||||
zap_line_in_file("b/options.conf", "use_clang = false")
|
||||
zap_line_in_file("b/options.conf", "# configure build for lto")
|
||||
zap_line_in_file("b/options.conf", "use_lto = false")
|
||||
zap_line_in_file("b/options.conf", "# require package verification for build")
|
||||
zap_line_in_file("b/options.conf", "verify_required = true")
|
||||
|
||||
zap_line_in_file("b/buildreq_add", "# This file contains additional build requirements that did not get")
|
||||
zap_line_in_file("b/buildreq_add", "# picked up automatically. One name per line, no whitespace.")
|
||||
zap_line_in_file("b/buildreq_ban", "# This file contains build requirements that get picked up but are")
|
||||
zap_line_in_file("b/buildreq_ban", "# undesirable. One entry per line, no whitespace.")
|
||||
|
||||
|
||||
zap_line_in_file("b/excludes", "# This file contains the output files that need %exclude. Full path")
|
||||
zap_line_in_file("b/excludes", "# names, one per line.")
|
||||
|
||||
zap_line_in_file("b/pkgconfig_add", "# This file contains additional pkgconfig build requirements that did")
|
||||
zap_line_in_file("b/pkgconfig_add", "# not get picked up automatically. One name per line, no whitespace.")
|
||||
zap_line_in_file("b/pkgconfig_ban", "# This file contains pkgconfig build requirements that get picked up")
|
||||
zap_line_in_file("b/pkgconfig_ban", "# but are undesirable. One entry per line, no whitespace.")
|
||||
zap_line_in_file("b/requires_add", "# This file contains additional runtime requirements that did not get")
|
||||
zap_line_in_file("b/requires_add", "# picked up automatically. One name per line, no whitespace.")
|
||||
zap_line_in_file("b/requires_ban", "# This file contains runtime requirements that get picked up but are")
|
||||
zap_line_in_file("b/requires_ban", "# undesirable. One entry per line, no whitespace.")
|
||||
|
||||
zap_line_in_file_start(".spec", "Summary : No detailed summary available")
|
||||
|
||||
zap_plus_line_in_file("symbols")
|
||||
zap_plus_line_in_file("symbols32")
|
||||
|
||||
zap_entire_file("b/whatrequires")
|
||||
|
||||
zap_empty_chunks()
|
||||
|
||||
print_all()
|
||||
|
||||
if __name__ == '__main__':
|
||||
with tempfile.TemporaryDirectory() as workingdir:
|
||||
main()
|
||||
|
||||
+2
-2
@@ -145,9 +145,9 @@ if [ "$USE_KOJI" ]; then
|
||||
cp "$CLIENTCA" ~/.koji/clientca.crt
|
||||
cp "$SERVERCA" ~/.koji/serverca.crt
|
||||
|
||||
if [ ! -f /etc/koji.conf ]; then
|
||||
if [ ! -f ~/.koji/config ]; then
|
||||
echo "Setting up koji config . . ."
|
||||
sudo cp projects/common/conf/koji.conf /etc
|
||||
cp -f projects/common/conf/koji.conf ~/.koji/config
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user