mirror of
https://github.com/clearlinux/common.git
synced 2026-09-06 05:31:45 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c360ffe52c | ||
|
|
f092f66d8d | ||
|
|
704e8c90b8 | ||
|
|
1ca80a16a3 | ||
|
|
27e359bda0 | ||
|
|
3db02dd609 | ||
|
|
5866d7afbf | ||
|
|
437d1ee01a | ||
|
|
cb5d78bb2f | ||
|
|
9bfaefc491 | ||
|
|
64a20fa5c2 | ||
|
|
e0b152250f | ||
|
|
70ca088ce6 | ||
|
|
a3c7b734fa | ||
|
|
7ff8c3a6d5 | ||
|
|
bdac11063e | ||
|
|
52f73c1530 | ||
|
|
072d9b81a2 | ||
|
|
85a3e1cd32 | ||
|
|
3bf41ad9c9 | ||
|
|
92b3d682ec | ||
|
|
ce873b4b19 | ||
|
|
463112629b | ||
|
|
0fd1fc5a1d | ||
|
|
0e9a2b7e82 | ||
|
|
398fb69708 | ||
|
|
cdcb8aa9d8 | ||
|
|
3168ba058e | ||
|
|
76fef57d5b | ||
|
|
59ea0b102e | ||
|
|
e4c604a161 | ||
|
|
59c4520f37 | ||
|
|
16f813a390 | ||
|
|
79eebc6aa6 | ||
|
|
d1accc8077 | ||
|
|
b23d156f2c |
+82
-20
@@ -166,6 +166,7 @@ preautospec-checks:
|
|||||||
#help to autospec.
|
#help to autospec.
|
||||||
#help For more information, see the project at https://github.com/clearlinux/autospec
|
#help For more information, see the project at https://github.com/clearlinux/autospec
|
||||||
autospec: preautospec-checks pullrebase localreponotice clean-old-content
|
autospec: preautospec-checks pullrebase localreponotice clean-old-content
|
||||||
|
git rm --ignore-unmatch pumpAutospec || rm -f pumpAutospec
|
||||||
@if [ -e $(SPECFILE) ] && ! grep -q "# Generated by: autospec.py" $(SPECFILE) ; then \
|
@if [ -e $(SPECFILE) ] && ! grep -q "# Generated by: autospec.py" $(SPECFILE) ; then \
|
||||||
echo "Specfile already exists and was not created by autospec.py! Aborting."; \
|
echo "Specfile already exists and was not created by autospec.py! Aborting."; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
@@ -222,6 +223,7 @@ scanlicense:
|
|||||||
#help the variable BUMP_MSG is set, its value is used as the commit summary.
|
#help the variable BUMP_MSG is set, its value is used as the commit summary.
|
||||||
#help Otherwise a generic commit summary is used.
|
#help Otherwise a generic commit summary is used.
|
||||||
bump:
|
bump:
|
||||||
|
git stash
|
||||||
git pull --rebase
|
git pull --rebase
|
||||||
$(MAKE) bumpnogit
|
$(MAKE) bumpnogit
|
||||||
git add $(SPECFILE) release
|
git add $(SPECFILE) release
|
||||||
@@ -406,17 +408,20 @@ update-versions:
|
|||||||
#help or update the package and push the update to koji.
|
#help or update the package and push the update to koji.
|
||||||
#help If no update.sh exists, update the version, autospec and push the
|
#help If no update.sh exists, update the version, autospec and push the
|
||||||
#help update to koji (bumping the bump.list if found).
|
#help update to koji (bumping the bump.list if found).
|
||||||
|
update: export AUTOSPEC_UPDATE=1
|
||||||
update:
|
update:
|
||||||
|
@if [ -f update.first ]; then \
|
||||||
|
for pkg in $$(< update.first); do \
|
||||||
|
(cd "../$${pkg}" || exit 1; $(MAKE) update-versions || exit 0; $(MAKE) update) || exit; \
|
||||||
|
done; \
|
||||||
|
fi
|
||||||
@if [ -f update.sh ]; then \
|
@if [ -f update.sh ]; then \
|
||||||
./update.sh; \
|
./update.sh; \
|
||||||
else \
|
else \
|
||||||
$(MAKE) -s update-versions && \
|
$(MAKE) -s update-versions && \
|
||||||
$(MAKE) autospec CLEANUP=1 && \
|
$(MAKE) autospec CLEANUP=1 && \
|
||||||
if [ -f bump.list ]; then \
|
$(MAKE) -s koji && \
|
||||||
$(MAKE) -s koji; \
|
$(MAKE) koji-waitrepo; \
|
||||||
else \
|
|
||||||
$(MAKE) -s koji-nowait; \
|
|
||||||
fi \
|
|
||||||
fi \
|
fi \
|
||||||
|
|
||||||
logcheck:
|
logcheck:
|
||||||
@@ -440,21 +445,6 @@ repoadd: $(TOPLVL)/repo
|
|||||||
$(MAKE) -s localrepocreate
|
$(MAKE) -s localrepocreate
|
||||||
$(MAKE) -s localrepoenable
|
$(MAKE) -s localrepoenable
|
||||||
|
|
||||||
#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
|
|
||||||
$(MAKE) -s repodel NO_CREATEREPO=1
|
|
||||||
@for r in ${LATEST_RPMS}; do \
|
|
||||||
echo "+$${rpm#rpms/}"; \
|
|
||||||
echo "$${rpm#rpms/}" >> .repo-index; \
|
|
||||||
done; \
|
|
||||||
flock $</repo.lock ln -f -t $< ${LATEST_RPMS}
|
|
||||||
|
|
||||||
#help repodel: Removes RPMs from the local RPM repository that were
|
#help repodel: Removes RPMs from the local RPM repository that were
|
||||||
#help previously added by 'make repoadd' for this package.
|
#help previously added by 'make repoadd' for this package.
|
||||||
repodel: $(TOPLVL)/repo
|
repodel: $(TOPLVL)/repo
|
||||||
@@ -592,6 +582,78 @@ cloc: $(SRPMFILE)
|
|||||||
@$(MOCK) --clean --scrub=chroot --uniqueext=$(PKG_NAME)
|
@$(MOCK) --clean --scrub=chroot --uniqueext=$(PKG_NAME)
|
||||||
cat results/cloc.txt
|
cat results/cloc.txt
|
||||||
|
|
||||||
|
#help catchup: Backport the commits from the current version to the upstream HEAD (not release).
|
||||||
|
#help Only works if giturl is defined and the current package version can be mapped to a git tag.
|
||||||
|
catchup:
|
||||||
|
$(MAKE) catchup-HEAD
|
||||||
|
|
||||||
|
#help catchup-<commit|tag>: Backport the commits from the current version to the specified commit or tag.
|
||||||
|
#help Only works if giturl is defined and the current package version can be mapped to a git tag.
|
||||||
|
catchup-%:
|
||||||
|
@target=$*; \
|
||||||
|
giturl=$$(grep -E '^giturl\s*=\s*\S+' options.conf | sed 's/giturl\s*=\s*//' 2>/dev/null); \
|
||||||
|
if [[ -z "$${giturl}" ]]; then \
|
||||||
|
echo "Error: giturl not defined in options.conf"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
mkdir -p results; \
|
||||||
|
if [[ -d results/$(PKG_NAME) ]]; then \
|
||||||
|
echo "Reusing existing repository..."; \
|
||||||
|
git -C results/$(PKG_NAME) fetch origin; \
|
||||||
|
else \
|
||||||
|
echo "Cloning upstream repository..."; \
|
||||||
|
git -C results clone "$${giturl}" $(PKG_NAME); \
|
||||||
|
fi; \
|
||||||
|
if ! git -C results/$(PKG_NAME) rev-parse --verify --quiet "$${target}" >/dev/null; then \
|
||||||
|
echo "Error: Target commit/tag $${target} not found"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
version=$$(rpm -q --qf '%{VERSION}\n' --specfile $(SPECFILE) | head -1); \
|
||||||
|
echo "Version: $${version}"; \
|
||||||
|
current_tag=$$(git -C results/$(PKG_NAME) tag --list | grep -E "^($(PKG_NAME)-)?v?$${version}$$") || { \
|
||||||
|
echo "Error: No tag found for current package version"; \
|
||||||
|
exit 1; \
|
||||||
|
}; \
|
||||||
|
echo "Catching up from $${current_tag} to $${target}"; \
|
||||||
|
for commit in $$(git -C results/$(PKG_NAME) log --reverse --pretty=oneline $${current_tag}..$${target} | cut -d' ' -f1); do \
|
||||||
|
$(MAKE) backport-$${commit}; \
|
||||||
|
done;
|
||||||
|
|
||||||
|
|
||||||
|
#help backport-<commit>: Retrieve a commit from the upstream git repository and save it as a backport patch.
|
||||||
|
#help The giturl is read from options.conf.
|
||||||
|
backport-%:
|
||||||
|
@commit=$*; \
|
||||||
|
echo "Backporting commit: $${commit}"; \
|
||||||
|
giturl=$$(grep -E '^giturl\s*=\s*\S+' options.conf | sed 's/giturl\s*=\s*//' 2>/dev/null); \
|
||||||
|
if [[ -z "$${giturl}" ]]; then \
|
||||||
|
echo "Error: giturl not defined in options.conf"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
mkdir -p results; \
|
||||||
|
if [[ -d results/$(PKG_NAME) ]]; then \
|
||||||
|
echo "Reusing existing repository..."; \
|
||||||
|
git -C results/$(PKG_NAME) fetch origin; \
|
||||||
|
else \
|
||||||
|
echo "Cloning upstream repository..."; \
|
||||||
|
git -C results clone "$${giturl}" $(PKG_NAME); \
|
||||||
|
fi; \
|
||||||
|
full_commit=$$(git -C results/$(PKG_NAME) show --pretty=oneline $${commit} 2>/dev/null | head -1 | cut -d' ' -f 1); \
|
||||||
|
if [[ -z "$${full_commit}" ]]; then \
|
||||||
|
echo "Error: Commit for $${commit} not found"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
patch=backport-$${full_commit}.patch; \
|
||||||
|
git -C results/$(PKG_NAME) format-patch -1 --stdout $${full_commit} > $${patch}; \
|
||||||
|
if [[ -s $${patch} ]]; then \
|
||||||
|
echo "$${patch} created"; \
|
||||||
|
grep -qE "^$${patch}$$" series 2>/dev/null || echo "$${patch}" >> series; \
|
||||||
|
else \
|
||||||
|
rm -f $${patch}; \
|
||||||
|
echo "Error: Failed to create backport patch"; \
|
||||||
|
exit 1; \
|
||||||
|
fi \
|
||||||
|
|
||||||
.PHONY: whatrequires
|
.PHONY: whatrequires
|
||||||
#help whatrequires: Output a list of packages that directly depend on this one,
|
#help whatrequires: Output a list of packages that directly depend on this one,
|
||||||
#help showing the subpackage-level breakdown. Each line of output has the format
|
#help showing the subpackage-level breakdown. Each line of output has the format
|
||||||
|
|||||||
+1
-46
@@ -237,7 +237,7 @@ autospecnew: preautospecnew-checks localreponotice
|
|||||||
--mock-config $(MOCK_CONFIG_VAL) \
|
--mock-config $(MOCK_CONFIG_VAL) \
|
||||||
--mock-opts="$(MOCK_OPTS)" \
|
--mock-opts="$(MOCK_OPTS)" \
|
||||||
$${SETVERSION:+ --version $${SETVERSION}} \
|
$${SETVERSION:+ --version $${SETVERSION}} \
|
||||||
${NON_INTERACTIVE} ${SKIP_GIT} ${CLEANUP} \
|
${NON_INTERACTIVE} ${SKIP_GIT} $(if $(CLEANUP),-C) \
|
||||||
$(URL); \
|
$(URL); \
|
||||||
if [ $$? -eq 0 ]; then \
|
if [ $$? -eq 0 ]; then \
|
||||||
$(MAKE) link-new-rpms PKG_REPO_DIR="${TOPLVL}/packages/${NAME}"; \
|
$(MAKE) link-new-rpms PKG_REPO_DIR="${TOPLVL}/packages/${NAME}"; \
|
||||||
@@ -256,51 +256,6 @@ autospecnew: preautospecnew-checks localreponotice
|
|||||||
exit 1; \
|
exit 1; \
|
||||||
fi
|
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 -b main; \
|
|
||||||
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; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
#help repoenable: Enables the local RPM repository for use with Yum/DNF and
|
#help repoenable: Enables the local RPM repository for use with Yum/DNF and
|
||||||
#help Mock. If this repository does not yet exist, it is created.
|
#help Mock. If this repository does not yet exist, it is created.
|
||||||
repoenable: localrepoenable ;
|
repoenable: localrepoenable ;
|
||||||
|
|||||||
-285
@@ -1,285 +0,0 @@
|
|||||||
#!/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")
|
|
||||||
@@ -5,3 +5,4 @@ GFDL-1.3+
|
|||||||
MIT-Opengroup
|
MIT-Opengroup
|
||||||
WXwindows
|
WXwindows
|
||||||
w3c
|
w3c
|
||||||
|
libpng-2.0
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ LibreCAD
|
|||||||
Linux-PAM
|
Linux-PAM
|
||||||
LuaJIT
|
LuaJIT
|
||||||
LyX
|
LyX
|
||||||
|
MangoHud
|
||||||
MarkupSafe
|
MarkupSafe
|
||||||
ModemManager
|
ModemManager
|
||||||
MuseScore
|
MuseScore
|
||||||
@@ -62,6 +63,8 @@ R-BMA
|
|||||||
R-BatchJobs
|
R-BatchJobs
|
||||||
R-BayesFactor
|
R-BayesFactor
|
||||||
R-BiasedUrn
|
R-BiasedUrn
|
||||||
|
R-Biobase
|
||||||
|
R-BiocGenerics
|
||||||
R-BiocManager
|
R-BiocManager
|
||||||
R-BoolNet
|
R-BoolNet
|
||||||
R-BradleyTerry2
|
R-BradleyTerry2
|
||||||
@@ -106,7 +109,6 @@ R-ICEbox
|
|||||||
R-ICS
|
R-ICS
|
||||||
R-ICSNP
|
R-ICSNP
|
||||||
R-IRdisplay
|
R-IRdisplay
|
||||||
R-IRkernel
|
|
||||||
R-ISOcodes
|
R-ISOcodes
|
||||||
R-ISwR
|
R-ISwR
|
||||||
R-Iso
|
R-Iso
|
||||||
@@ -122,6 +124,7 @@ R-MNP
|
|||||||
R-MatchIt
|
R-MatchIt
|
||||||
R-Matching
|
R-Matching
|
||||||
R-MatrixModels
|
R-MatrixModels
|
||||||
|
R-MetricsWeighted
|
||||||
R-ModelMetrics
|
R-ModelMetrics
|
||||||
R-NADA
|
R-NADA
|
||||||
R-NLP
|
R-NLP
|
||||||
@@ -149,6 +152,7 @@ R-RNetCDF
|
|||||||
R-ROCR
|
R-ROCR
|
||||||
R-ROSE
|
R-ROSE
|
||||||
R-RProtoBuf
|
R-RProtoBuf
|
||||||
|
R-RPushbullet
|
||||||
R-RSQLite
|
R-RSQLite
|
||||||
R-RSclient
|
R-RSclient
|
||||||
R-RUnit
|
R-RUnit
|
||||||
@@ -176,6 +180,7 @@ R-Ryacas
|
|||||||
R-SGP
|
R-SGP
|
||||||
R-SGPdata
|
R-SGPdata
|
||||||
R-SQUAREM
|
R-SQUAREM
|
||||||
|
R-SimDesign
|
||||||
R-Sleuth2
|
R-Sleuth2
|
||||||
R-SnowballC
|
R-SnowballC
|
||||||
R-SparseM
|
R-SparseM
|
||||||
@@ -217,6 +222,7 @@ R-arules
|
|||||||
R-ash
|
R-ash
|
||||||
R-askpass
|
R-askpass
|
||||||
R-assertthat
|
R-assertthat
|
||||||
|
R-audio
|
||||||
R-backports
|
R-backports
|
||||||
R-base64enc
|
R-base64enc
|
||||||
R-base64url
|
R-base64url
|
||||||
@@ -227,6 +233,7 @@ R-bayesplot
|
|||||||
R-bazar
|
R-bazar
|
||||||
R-bbmle
|
R-bbmle
|
||||||
R-bdsmatrix
|
R-bdsmatrix
|
||||||
|
R-beepr
|
||||||
R-beeswarm
|
R-beeswarm
|
||||||
R-bench
|
R-bench
|
||||||
R-benchr
|
R-benchr
|
||||||
@@ -264,6 +271,7 @@ R-calibrator
|
|||||||
R-callr
|
R-callr
|
||||||
R-car
|
R-car
|
||||||
R-carData
|
R-carData
|
||||||
|
R-cards
|
||||||
R-caret
|
R-caret
|
||||||
R-cclust
|
R-cclust
|
||||||
R-cellranger
|
R-cellranger
|
||||||
@@ -339,6 +347,7 @@ R-distr
|
|||||||
R-distrEx
|
R-distrEx
|
||||||
R-distributional
|
R-distributional
|
||||||
R-dlm
|
R-dlm
|
||||||
|
R-doBy
|
||||||
R-doMC
|
R-doMC
|
||||||
R-doMPI
|
R-doMPI
|
||||||
R-doParallel
|
R-doParallel
|
||||||
@@ -352,6 +361,7 @@ R-drc
|
|||||||
R-dreamerr
|
R-dreamerr
|
||||||
R-dtplyr
|
R-dtplyr
|
||||||
R-dtw
|
R-dtw
|
||||||
|
R-duckdb
|
||||||
R-dygraphs
|
R-dygraphs
|
||||||
R-dynamicTreeCut
|
R-dynamicTreeCut
|
||||||
R-dynlm
|
R-dynlm
|
||||||
@@ -657,6 +667,7 @@ R-mvnormtest
|
|||||||
R-mvoutlier
|
R-mvoutlier
|
||||||
R-mvtnorm
|
R-mvtnorm
|
||||||
R-nanoarrow
|
R-nanoarrow
|
||||||
|
R-nanoparquet
|
||||||
R-natserv
|
R-natserv
|
||||||
R-ncbit
|
R-ncbit
|
||||||
R-ncdf4
|
R-ncdf4
|
||||||
@@ -862,6 +873,7 @@ R-rsvg
|
|||||||
R-runjags
|
R-runjags
|
||||||
R-rversions
|
R-rversions
|
||||||
R-rvest
|
R-rvest
|
||||||
|
R-rworldmap
|
||||||
R-s2
|
R-s2
|
||||||
R-sampling
|
R-sampling
|
||||||
R-sandwich
|
R-sandwich
|
||||||
@@ -880,6 +892,7 @@ R-sessioninfo
|
|||||||
R-setRNG
|
R-setRNG
|
||||||
R-sets
|
R-sets
|
||||||
R-sf
|
R-sf
|
||||||
|
R-sfd
|
||||||
R-sfsmisc
|
R-sfsmisc
|
||||||
R-sgeostat
|
R-sgeostat
|
||||||
R-shape
|
R-shape
|
||||||
@@ -915,6 +928,7 @@ R-spatstat.linnet
|
|||||||
R-spatstat.model
|
R-spatstat.model
|
||||||
R-spatstat.random
|
R-spatstat.random
|
||||||
R-spatstat.sparse
|
R-spatstat.sparse
|
||||||
|
R-spatstat.univar
|
||||||
R-spatstat.utils
|
R-spatstat.utils
|
||||||
R-spc
|
R-spc
|
||||||
R-spdep
|
R-spdep
|
||||||
@@ -964,6 +978,7 @@ R-tibble
|
|||||||
R-tidyr
|
R-tidyr
|
||||||
R-tidyrules
|
R-tidyrules
|
||||||
R-tidyselect
|
R-tidyselect
|
||||||
|
R-tidytable
|
||||||
R-tidyverse
|
R-tidyverse
|
||||||
R-tikzDevice
|
R-tikzDevice
|
||||||
R-timeDate
|
R-timeDate
|
||||||
@@ -1073,6 +1088,7 @@ WPEBackend-fdo
|
|||||||
WireGuard
|
WireGuard
|
||||||
XStatic-term.js
|
XStatic-term.js
|
||||||
Z3
|
Z3
|
||||||
|
aardvark-dns
|
||||||
abireport
|
abireport
|
||||||
abseil-cpp
|
abseil-cpp
|
||||||
accel-config
|
accel-config
|
||||||
@@ -1104,6 +1120,7 @@ ansible
|
|||||||
ansible-core
|
ansible-core
|
||||||
antlr4-python3-runtime
|
antlr4-python3-runtime
|
||||||
apache-ant
|
apache-ant
|
||||||
|
apache-arrow
|
||||||
appstream
|
appstream
|
||||||
appstream-glib
|
appstream-glib
|
||||||
apr
|
apr
|
||||||
@@ -1150,7 +1167,10 @@ avahi
|
|||||||
awesome-wm
|
awesome-wm
|
||||||
awscli
|
awscli
|
||||||
axel
|
axel
|
||||||
|
azure-c-logging
|
||||||
azure-configs
|
azure-configs
|
||||||
|
azure-macro-utils-c
|
||||||
|
azure-umock-c
|
||||||
babeltrace
|
babeltrace
|
||||||
babl
|
babl
|
||||||
baloo
|
baloo
|
||||||
@@ -1161,7 +1181,7 @@ bash-completion
|
|||||||
bashdb
|
bashdb
|
||||||
bats
|
bats
|
||||||
bc
|
bc
|
||||||
bcache-tools
|
bcachefs-tools
|
||||||
bcc
|
bcc
|
||||||
bcftools
|
bcftools
|
||||||
bdftopcf
|
bdftopcf
|
||||||
@@ -1187,6 +1207,7 @@ boost
|
|||||||
borgbackup
|
borgbackup
|
||||||
boto3
|
boto3
|
||||||
botocore
|
botocore
|
||||||
|
bottom
|
||||||
bovo
|
bovo
|
||||||
box2d
|
box2d
|
||||||
bpftool
|
bpftool
|
||||||
@@ -1217,10 +1238,13 @@ buildreq-qmake
|
|||||||
buildreq-qt6
|
buildreq-qt6
|
||||||
buildreq-scons
|
buildreq-scons
|
||||||
buildx
|
buildx
|
||||||
|
bwidget
|
||||||
byobu
|
byobu
|
||||||
bz2file
|
bz2file
|
||||||
bzip2
|
bzip2
|
||||||
c-ares
|
c-ares
|
||||||
|
c-blosc
|
||||||
|
c-blosc2
|
||||||
cJSON
|
cJSON
|
||||||
c_rehash
|
c_rehash
|
||||||
ca-certs
|
ca-certs
|
||||||
@@ -1246,6 +1270,7 @@ cereal
|
|||||||
cfitsio
|
cfitsio
|
||||||
cgdb
|
cgdb
|
||||||
cgit
|
cgit
|
||||||
|
chafa
|
||||||
check
|
check
|
||||||
cheese
|
cheese
|
||||||
chirp
|
chirp
|
||||||
@@ -1299,7 +1324,6 @@ cmocka
|
|||||||
cmrt
|
cmrt
|
||||||
cmus
|
cmus
|
||||||
cnf
|
cnf
|
||||||
cni
|
|
||||||
cni-plugins
|
cni-plugins
|
||||||
cockpit
|
cockpit
|
||||||
codec2
|
codec2
|
||||||
@@ -1314,19 +1338,23 @@ colord-kde
|
|||||||
colordiff
|
colordiff
|
||||||
columbiad
|
columbiad
|
||||||
compat-Botan-soname2
|
compat-Botan-soname2
|
||||||
|
compat-abseil-cpp-rolling
|
||||||
compat-atkmm-soname16
|
compat-atkmm-soname16
|
||||||
compat-babeltrace-one
|
compat-babeltrace-one
|
||||||
compat-cairomm-soname10
|
compat-cairomm-soname10
|
||||||
compat-codec2-soname1
|
compat-codec2-soname1
|
||||||
compat-enchant-soname1
|
compat-enchant-soname1
|
||||||
compat-ffmpeg-4.4
|
compat-ffmpeg-4.4
|
||||||
|
compat-ffmpeg-6
|
||||||
compat-fuse-soname2
|
compat-fuse-soname2
|
||||||
compat-gcc-10
|
compat-gcc-10
|
||||||
compat-gcr-soname1
|
compat-gcr-soname1
|
||||||
compat-glibmm-soname24
|
compat-glibmm-soname24
|
||||||
compat-gnome-bluetooth-soname-13
|
compat-gnome-bluetooth-soname-13
|
||||||
|
compat-grpc-soname66
|
||||||
compat-gsl-soname27
|
compat-gsl-soname27
|
||||||
compat-gtksourceview-soname3
|
compat-gtksourceview-soname3
|
||||||
|
compat-icu4c-rolling
|
||||||
compat-json-c-soname4
|
compat-json-c-soname4
|
||||||
compat-libffi-soname6
|
compat-libffi-soname6
|
||||||
compat-libffi-soname7
|
compat-libffi-soname7
|
||||||
@@ -1339,6 +1367,7 @@ compat-libvpx-soname8
|
|||||||
compat-pangomm-soname14
|
compat-pangomm-soname14
|
||||||
compat-protobuf-soname29
|
compat-protobuf-soname29
|
||||||
compat-protobuf-soname32
|
compat-protobuf-soname32
|
||||||
|
compat-python3-rolling
|
||||||
compat-re2-soname10
|
compat-re2-soname10
|
||||||
compat-readline-soname5
|
compat-readline-soname5
|
||||||
compat-taglib-soname1
|
compat-taglib-soname1
|
||||||
@@ -1380,6 +1409,7 @@ cups-filters
|
|||||||
cups-pk-helper
|
cups-pk-helper
|
||||||
curl
|
curl
|
||||||
cycler
|
cycler
|
||||||
|
cyme
|
||||||
cyrus-sasl
|
cyrus-sasl
|
||||||
dapl
|
dapl
|
||||||
darktable
|
darktable
|
||||||
@@ -1392,6 +1422,7 @@ dbus-glib
|
|||||||
dbus-python
|
dbus-python
|
||||||
dconf
|
dconf
|
||||||
dconf-editor
|
dconf-editor
|
||||||
|
ddcutil
|
||||||
ddd
|
ddd
|
||||||
deap
|
deap
|
||||||
debugedit
|
debugedit
|
||||||
@@ -1500,8 +1531,10 @@ fakeroot
|
|||||||
falcosecurity-libs
|
falcosecurity-libs
|
||||||
fann
|
fann
|
||||||
farstream
|
farstream
|
||||||
|
fastfetch
|
||||||
faultstat
|
faultstat
|
||||||
fcgi
|
fcgi
|
||||||
|
fd
|
||||||
fdk-aac
|
fdk-aac
|
||||||
fdupes
|
fdupes
|
||||||
feh
|
feh
|
||||||
@@ -1548,7 +1581,6 @@ freeglut
|
|||||||
freeipmi
|
freeipmi
|
||||||
freetype
|
freetype
|
||||||
fribidi
|
fribidi
|
||||||
fritzing-app
|
|
||||||
frozen
|
frozen
|
||||||
fs
|
fs
|
||||||
fsarchiver
|
fsarchiver
|
||||||
@@ -1556,8 +1588,10 @@ fsearch
|
|||||||
fuse
|
fuse
|
||||||
fwupd
|
fwupd
|
||||||
fwupd-efi
|
fwupd-efi
|
||||||
|
game-music-emu
|
||||||
garcon
|
garcon
|
||||||
gawk
|
gawk
|
||||||
|
gbinder-python
|
||||||
gc
|
gc
|
||||||
gcab
|
gcab
|
||||||
gcc
|
gcc
|
||||||
@@ -1577,8 +1611,6 @@ gdm
|
|||||||
geany
|
geany
|
||||||
geany-plugins
|
geany-plugins
|
||||||
geary
|
geary
|
||||||
gedit
|
|
||||||
gedit-plugins-gnome
|
|
||||||
geeqie
|
geeqie
|
||||||
gegl
|
gegl
|
||||||
gengetopt
|
gengetopt
|
||||||
@@ -1676,6 +1708,9 @@ goaccess
|
|||||||
gobject-introspection
|
gobject-introspection
|
||||||
golang-github-cpuguy83-go-md2man
|
golang-github-cpuguy83-go-md2man
|
||||||
goocanvas
|
goocanvas
|
||||||
|
google-benchmark
|
||||||
|
google-cloud-cpp
|
||||||
|
google-crc32c
|
||||||
googletest
|
googletest
|
||||||
gparted
|
gparted
|
||||||
gpaste
|
gpaste
|
||||||
@@ -1739,6 +1774,7 @@ gzip
|
|||||||
hamlib
|
hamlib
|
||||||
haproxy
|
haproxy
|
||||||
hardinfo
|
hardinfo
|
||||||
|
hardinfo2
|
||||||
harfbuzz
|
harfbuzz
|
||||||
haveged
|
haveged
|
||||||
hdf5
|
hdf5
|
||||||
@@ -1749,6 +1785,7 @@ help2man
|
|||||||
hexchat
|
hexchat
|
||||||
hexedit
|
hexedit
|
||||||
hicolor-icon-theme
|
hicolor-icon-theme
|
||||||
|
highway
|
||||||
hiredis-c
|
hiredis-c
|
||||||
hostname
|
hostname
|
||||||
howdy
|
howdy
|
||||||
@@ -1760,7 +1797,6 @@ hub
|
|||||||
hugo
|
hugo
|
||||||
hunspell
|
hunspell
|
||||||
hwloc
|
hwloc
|
||||||
hyperscan
|
|
||||||
hyphen
|
hyphen
|
||||||
i2c-tools
|
i2c-tools
|
||||||
i3
|
i3
|
||||||
@@ -1810,9 +1846,9 @@ iotop
|
|||||||
ipaddr
|
ipaddr
|
||||||
ipe
|
ipe
|
||||||
iperf
|
iperf
|
||||||
ipmctl
|
|
||||||
ipmitool
|
ipmitool
|
||||||
ipp-crypto
|
ipp-crypto
|
||||||
|
ipp-usb
|
||||||
iproute2
|
iproute2
|
||||||
ipset
|
ipset
|
||||||
iptables
|
iptables
|
||||||
@@ -1825,6 +1861,7 @@ irrlicht
|
|||||||
irrlichtmt
|
irrlichtmt
|
||||||
irssi
|
irssi
|
||||||
isa-l
|
isa-l
|
||||||
|
isl
|
||||||
iso-codes
|
iso-codes
|
||||||
isodate
|
isodate
|
||||||
isomd5sum
|
isomd5sum
|
||||||
@@ -2170,6 +2207,7 @@ libfontenc
|
|||||||
libfprint
|
libfprint
|
||||||
libfreehand
|
libfreehand
|
||||||
libftdi1
|
libftdi1
|
||||||
|
libgbinder
|
||||||
libgcrypt
|
libgcrypt
|
||||||
libgd
|
libgd
|
||||||
libgdata
|
libgdata
|
||||||
@@ -2178,6 +2216,7 @@ libgee
|
|||||||
libgeotiff
|
libgeotiff
|
||||||
libgit2
|
libgit2
|
||||||
libgit2-glib
|
libgit2-glib
|
||||||
|
libglibutil
|
||||||
libglvnd
|
libglvnd
|
||||||
libgnome-keyring
|
libgnome-keyring
|
||||||
libgnomekbd
|
libgnomekbd
|
||||||
@@ -2229,6 +2268,7 @@ libmbim
|
|||||||
libmediaart
|
libmediaart
|
||||||
libmemcached
|
libmemcached
|
||||||
libmicrohttpd
|
libmicrohttpd
|
||||||
|
libmikmod
|
||||||
libmnl
|
libmnl
|
||||||
libmodbus
|
libmodbus
|
||||||
libmodplug
|
libmodplug
|
||||||
@@ -2262,6 +2302,7 @@ libodfgen
|
|||||||
libogg
|
libogg
|
||||||
libopenmpt
|
libopenmpt
|
||||||
libopenzwave
|
libopenzwave
|
||||||
|
libopusenc
|
||||||
liborcus
|
liborcus
|
||||||
libosinfo
|
libosinfo
|
||||||
libpagemaker
|
libpagemaker
|
||||||
@@ -2279,6 +2320,7 @@ libportal
|
|||||||
libproxy
|
libproxy
|
||||||
libpsl
|
libpsl
|
||||||
libpthread-stubs
|
libpthread-stubs
|
||||||
|
libptytty
|
||||||
libpwquality
|
libpwquality
|
||||||
libqaccessibilityclient
|
libqaccessibilityclient
|
||||||
libqalculate
|
libqalculate
|
||||||
@@ -2313,6 +2355,7 @@ libsoup
|
|||||||
libspatialindex
|
libspatialindex
|
||||||
libspatialite
|
libspatialite
|
||||||
libspectre
|
libspectre
|
||||||
|
libspelling
|
||||||
libspiro
|
libspiro
|
||||||
libspnav
|
libspnav
|
||||||
libspng
|
libspng
|
||||||
@@ -2346,7 +2389,9 @@ libva
|
|||||||
libva-intel-driver
|
libva-intel-driver
|
||||||
libva-utils
|
libva-utils
|
||||||
libvdpau
|
libvdpau
|
||||||
|
libversion
|
||||||
libvirt
|
libvirt
|
||||||
|
libvirt-dbus
|
||||||
libvirt-glib
|
libvirt-glib
|
||||||
libvirt-python
|
libvirt-python
|
||||||
libvisio
|
libvisio
|
||||||
@@ -2405,6 +2450,8 @@ llvm
|
|||||||
llvm14
|
llvm14
|
||||||
llvm15
|
llvm15
|
||||||
llvm16
|
llvm16
|
||||||
|
llvm17
|
||||||
|
llvm18
|
||||||
lm-sensors
|
lm-sensors
|
||||||
lmdb
|
lmdb
|
||||||
logrotate
|
logrotate
|
||||||
@@ -2426,6 +2473,7 @@ luarocks
|
|||||||
lutris
|
lutris
|
||||||
luv
|
luv
|
||||||
lv2
|
lv2
|
||||||
|
lxc
|
||||||
lynx
|
lynx
|
||||||
lz4
|
lz4
|
||||||
lzlib
|
lzlib
|
||||||
@@ -2476,6 +2524,7 @@ micro-config-drive-aws
|
|||||||
micro-config-drive-equinix
|
micro-config-drive-equinix
|
||||||
micro-config-drive-oci
|
micro-config-drive-oci
|
||||||
milou
|
milou
|
||||||
|
mimalloc
|
||||||
mimetreeparser
|
mimetreeparser
|
||||||
minetest
|
minetest
|
||||||
minetest_game
|
minetest_game
|
||||||
@@ -2503,6 +2552,7 @@ modsecurity
|
|||||||
modsecurity-nginx
|
modsecurity-nginx
|
||||||
modules
|
modules
|
||||||
mokutil
|
mokutil
|
||||||
|
mold
|
||||||
mono
|
mono
|
||||||
moreutils
|
moreutils
|
||||||
mosh
|
mosh
|
||||||
@@ -2511,6 +2561,7 @@ motd-update
|
|||||||
motif
|
motif
|
||||||
mozjs102
|
mozjs102
|
||||||
mozjs115
|
mozjs115
|
||||||
|
mozjs128
|
||||||
mozjs91
|
mozjs91
|
||||||
mpc
|
mpc
|
||||||
mpfr
|
mpfr
|
||||||
@@ -2552,6 +2603,7 @@ neovim
|
|||||||
net-snmp
|
net-snmp
|
||||||
net-tools
|
net-tools
|
||||||
netaddr
|
netaddr
|
||||||
|
netavark
|
||||||
netbase
|
netbase
|
||||||
netcdf
|
netcdf
|
||||||
netcdf-fortran
|
netcdf-fortran
|
||||||
@@ -2562,6 +2614,7 @@ nettle
|
|||||||
network-manager-applet
|
network-manager-applet
|
||||||
networkmanager-qt
|
networkmanager-qt
|
||||||
newt
|
newt
|
||||||
|
nextcloud-desktop
|
||||||
nfs-utils
|
nfs-utils
|
||||||
nftables
|
nftables
|
||||||
nghttp2
|
nghttp2
|
||||||
@@ -2678,6 +2731,7 @@ parallel
|
|||||||
parley
|
parley
|
||||||
parted
|
parted
|
||||||
pass
|
pass
|
||||||
|
passt
|
||||||
passwdqc
|
passwdqc
|
||||||
patch
|
patch
|
||||||
patchelf
|
patchelf
|
||||||
@@ -3072,6 +3126,7 @@ perl-IPC-ShareLite
|
|||||||
perl-IPC-Shareable
|
perl-IPC-Shareable
|
||||||
perl-IPC-System-Simple
|
perl-IPC-System-Simple
|
||||||
perl-Image-Base
|
perl-Image-Base
|
||||||
|
perl-Image-ExifTool
|
||||||
perl-Image-Info
|
perl-Image-Info
|
||||||
perl-Image-Size
|
perl-Image-Size
|
||||||
perl-Image-Xbm
|
perl-Image-Xbm
|
||||||
@@ -3425,7 +3480,6 @@ perl-Test-Without-Module
|
|||||||
perl-Test-YAML
|
perl-Test-YAML
|
||||||
perl-Test-utf8
|
perl-Test-utf8
|
||||||
perl-Test2-Plugin-NoWarnings
|
perl-Test2-Plugin-NoWarnings
|
||||||
perl-Test2-Suite
|
|
||||||
perl-Text-Autoformat
|
perl-Text-Autoformat
|
||||||
perl-Text-Brew
|
perl-Text-Brew
|
||||||
perl-Text-CSV
|
perl-Text-CSV
|
||||||
@@ -3690,6 +3744,7 @@ pynvim
|
|||||||
pyotherside
|
pyotherside
|
||||||
pyotp
|
pyotp
|
||||||
pyparted
|
pyparted
|
||||||
|
pypi-Yapps
|
||||||
pypi-absl_py
|
pypi-absl_py
|
||||||
pypi-abydos
|
pypi-abydos
|
||||||
pypi-accelerate
|
pypi-accelerate
|
||||||
@@ -3697,15 +3752,16 @@ pypi-acme
|
|||||||
pypi-adal
|
pypi-adal
|
||||||
pypi-aiodns
|
pypi-aiodns
|
||||||
pypi-aiofiles
|
pypi-aiofiles
|
||||||
|
pypi-aiohappyeyeballs
|
||||||
pypi-aiohttp
|
pypi-aiohttp
|
||||||
pypi-aiohttp_cors
|
pypi-aiohttp_cors
|
||||||
pypi-aiosignal
|
pypi-aiosignal
|
||||||
pypi-aiosmtpd
|
pypi-aiosmtpd
|
||||||
pypi-aiosqlite
|
pypi-aiosqlite
|
||||||
pypi-alabaster
|
pypi-alabaster
|
||||||
|
pypi-altair
|
||||||
pypi-altgraph
|
pypi-altgraph
|
||||||
pypi-amqp
|
pypi-amqp
|
||||||
pypi-aniso8601
|
|
||||||
pypi-annotated_types
|
pypi-annotated_types
|
||||||
pypi-ansi2html
|
pypi-ansi2html
|
||||||
pypi-ansible_builder
|
pypi-ansible_builder
|
||||||
@@ -3741,7 +3797,6 @@ pypi-atpublic
|
|||||||
pypi-attr
|
pypi-attr
|
||||||
pypi-attrdict
|
pypi-attrdict
|
||||||
pypi-attrs
|
pypi-attrs
|
||||||
pypi-autocommand
|
|
||||||
pypi-automat
|
pypi-automat
|
||||||
pypi-awesomeversion
|
pypi-awesomeversion
|
||||||
pypi-awscrt
|
pypi-awscrt
|
||||||
@@ -3759,7 +3814,6 @@ pypi-babel
|
|||||||
pypi-backcall
|
pypi-backcall
|
||||||
pypi-backoff
|
pypi-backoff
|
||||||
pypi-backports.ssl_match_hostname
|
pypi-backports.ssl_match_hostname
|
||||||
pypi-bash_kernel
|
|
||||||
pypi-bashlex
|
pypi-bashlex
|
||||||
pypi-bcrypt
|
pypi-bcrypt
|
||||||
pypi-beartype
|
pypi-beartype
|
||||||
@@ -3776,6 +3830,8 @@ pypi-blessed
|
|||||||
pypi-blinker
|
pypi-blinker
|
||||||
pypi-blivet
|
pypi-blivet
|
||||||
pypi-blockdiag
|
pypi-blockdiag
|
||||||
|
pypi-blosc
|
||||||
|
pypi-blosc2
|
||||||
pypi-bokeh
|
pypi-bokeh
|
||||||
pypi-boolean.py
|
pypi-boolean.py
|
||||||
pypi-booleanoperations
|
pypi-booleanoperations
|
||||||
@@ -3796,14 +3852,12 @@ pypi-cachy
|
|||||||
pypi-cairocffi
|
pypi-cairocffi
|
||||||
pypi-cairosvg
|
pypi-cairosvg
|
||||||
pypi-calver
|
pypi-calver
|
||||||
pypi-capturer
|
|
||||||
pypi-cattrs
|
pypi-cattrs
|
||||||
pypi-cerberus
|
pypi-cerberus
|
||||||
pypi-certbot
|
pypi-certbot
|
||||||
pypi-certbot_dns_google
|
pypi-certbot_dns_google
|
||||||
pypi-certifi
|
pypi-certifi
|
||||||
pypi-cffi
|
pypi-cffi
|
||||||
pypi-cffsubr
|
|
||||||
pypi-cfgv
|
pypi-cfgv
|
||||||
pypi-chai
|
pypi-chai
|
||||||
pypi-chaospy
|
pypi-chaospy
|
||||||
@@ -3813,7 +3867,6 @@ pypi-check_jsonschema
|
|||||||
pypi-check_manifest
|
pypi-check_manifest
|
||||||
pypi-cheetah3
|
pypi-cheetah3
|
||||||
pypi-cheroot
|
pypi-cheroot
|
||||||
pypi-cherrypy
|
|
||||||
pypi-cibuildwheel
|
pypi-cibuildwheel
|
||||||
pypi-ciscoisesdk
|
pypi-ciscoisesdk
|
||||||
pypi-ciso8601
|
pypi-ciso8601
|
||||||
@@ -3825,11 +3878,11 @@ pypi-click_log
|
|||||||
pypi-clikit
|
pypi-clikit
|
||||||
pypi-cloudevents
|
pypi-cloudevents
|
||||||
pypi-cloudflare
|
pypi-cloudflare
|
||||||
|
pypi-clr_artifact
|
||||||
pypi-cmarkgfm
|
pypi-cmarkgfm
|
||||||
pypi-cmd2
|
pypi-cmd2
|
||||||
pypi-codecov
|
pypi-codecov
|
||||||
pypi-colorama
|
pypi-colorama
|
||||||
pypi-coloredlogs
|
|
||||||
pypi-colorlog
|
pypi-colorlog
|
||||||
pypi-columnize
|
pypi-columnize
|
||||||
pypi-comm
|
pypi-comm
|
||||||
@@ -3842,6 +3895,7 @@ pypi-cons
|
|||||||
pypi-contextlib2
|
pypi-contextlib2
|
||||||
pypi-contextvars
|
pypi-contextvars
|
||||||
pypi-contourpy
|
pypi-contourpy
|
||||||
|
pypi-controlnet_aux
|
||||||
pypi-cookiecutter
|
pypi-cookiecutter
|
||||||
pypi-coverage
|
pypi-coverage
|
||||||
pypi-coverage_enable_subprocess
|
pypi-coverage_enable_subprocess
|
||||||
@@ -3849,6 +3903,7 @@ pypi-coveralls
|
|||||||
pypi-cppy
|
pypi-cppy
|
||||||
pypi-crashtest
|
pypi-crashtest
|
||||||
pypi-crcmod
|
pypi-crcmod
|
||||||
|
pypi-crypt_r
|
||||||
pypi-cryptography
|
pypi-cryptography
|
||||||
pypi-cryptography_vectors
|
pypi-cryptography_vectors
|
||||||
pypi-cs
|
pypi-cs
|
||||||
@@ -3859,6 +3914,7 @@ pypi-cu2qu
|
|||||||
pypi-curio
|
pypi-curio
|
||||||
pypi-cvss
|
pypi-cvss
|
||||||
pypi-cxxfilt
|
pypi-cxxfilt
|
||||||
|
pypi-cysystemd
|
||||||
pypi-cython
|
pypi-cython
|
||||||
pypi-cytoolz
|
pypi-cytoolz
|
||||||
pypi-dacite
|
pypi-dacite
|
||||||
@@ -3870,6 +3926,7 @@ pypi-decorator
|
|||||||
pypi-deepmerge
|
pypi-deepmerge
|
||||||
pypi-deepspeed
|
pypi-deepspeed
|
||||||
pypi-dep_logic
|
pypi-dep_logic
|
||||||
|
pypi-dependency_groups
|
||||||
pypi-deprecated
|
pypi-deprecated
|
||||||
pypi-deprecation
|
pypi-deprecation
|
||||||
pypi-devpi_client
|
pypi-devpi_client
|
||||||
@@ -3900,12 +3957,17 @@ pypi-docopt
|
|||||||
pypi-docstring_parser
|
pypi-docstring_parser
|
||||||
pypi-docstring_to_markdown
|
pypi-docstring_to_markdown
|
||||||
pypi-docutils
|
pypi-docutils
|
||||||
|
pypi-doit
|
||||||
pypi-doxypypy
|
pypi-doxypypy
|
||||||
pypi-doxyqml
|
pypi-doxyqml
|
||||||
pypi-dpcontracts
|
pypi-dpcontracts
|
||||||
pypi-dulwich
|
pypi-dulwich
|
||||||
|
pypi-durationpy
|
||||||
pypi-ecdsa
|
pypi-ecdsa
|
||||||
pypi-editables
|
pypi-editables
|
||||||
|
pypi-editdistance
|
||||||
|
pypi-edlib
|
||||||
|
pypi-einops
|
||||||
pypi-elementpath
|
pypi-elementpath
|
||||||
pypi-enrich
|
pypi-enrich
|
||||||
pypi-entrypoints
|
pypi-entrypoints
|
||||||
@@ -3941,6 +4003,7 @@ pypi-flaky
|
|||||||
pypi-flask
|
pypi-flask
|
||||||
pypi-flatbuffers
|
pypi-flatbuffers
|
||||||
pypi-flatten_json
|
pypi-flatten_json
|
||||||
|
pypi-flexcache
|
||||||
pypi-flexparser
|
pypi-flexparser
|
||||||
pypi-flit
|
pypi-flit
|
||||||
pypi-flit_core
|
pypi-flit_core
|
||||||
@@ -3955,6 +4018,7 @@ pypi-ftfy
|
|||||||
pypi-funcparserlib
|
pypi-funcparserlib
|
||||||
pypi-future
|
pypi-future
|
||||||
pypi-gast
|
pypi-gast
|
||||||
|
pypi-gdown
|
||||||
pypi-gevent
|
pypi-gevent
|
||||||
pypi-geventhttpclient
|
pypi-geventhttpclient
|
||||||
pypi-ghp_import
|
pypi-ghp_import
|
||||||
@@ -4057,10 +4121,8 @@ pypi-isort
|
|||||||
pypi-itsdangerous
|
pypi-itsdangerous
|
||||||
pypi-janus
|
pypi-janus
|
||||||
pypi-jaraco.classes
|
pypi-jaraco.classes
|
||||||
pypi-jaraco.collections
|
|
||||||
pypi-jaraco.context
|
pypi-jaraco.context
|
||||||
pypi-jaraco.functools
|
pypi-jaraco.functools
|
||||||
pypi-jaraco.text
|
|
||||||
pypi-jarn.viewdoc
|
pypi-jarn.viewdoc
|
||||||
pypi-javaproperties
|
pypi-javaproperties
|
||||||
pypi-jedi
|
pypi-jedi
|
||||||
@@ -4073,7 +4135,6 @@ pypi-jinxed
|
|||||||
pypi-jmespath
|
pypi-jmespath
|
||||||
pypi-joblib
|
pypi-joblib
|
||||||
pypi-josepy
|
pypi-josepy
|
||||||
pypi-jsmin
|
|
||||||
pypi-json5
|
pypi-json5
|
||||||
pypi-jsondiff
|
pypi-jsondiff
|
||||||
pypi-jsonlines
|
pypi-jsonlines
|
||||||
@@ -4101,6 +4162,9 @@ pypi-jupyterlab_link_share
|
|||||||
pypi-jupyterlab_pygments
|
pypi-jupyterlab_pygments
|
||||||
pypi-jupyterlab_server
|
pypi-jupyterlab_server
|
||||||
pypi-jupyterlab_widgets
|
pypi-jupyterlab_widgets
|
||||||
|
pypi-jupyterlite_core
|
||||||
|
pypi-jupyterlite_pyodide_kernel
|
||||||
|
pypi-jupyterlite_sphinx
|
||||||
pypi-jxmlease
|
pypi-jxmlease
|
||||||
pypi-kcc
|
pypi-kcc
|
||||||
pypi-kerberos
|
pypi-kerberos
|
||||||
@@ -4118,6 +4182,7 @@ pypi-lazy
|
|||||||
pypi-lazy_loader
|
pypi-lazy_loader
|
||||||
pypi-lazy_object_proxy
|
pypi-lazy_object_proxy
|
||||||
pypi-ldap3
|
pypi-ldap3
|
||||||
|
pypi-legacy_cgi
|
||||||
pypi-levenshtein
|
pypi-levenshtein
|
||||||
pypi-libarchive_c
|
pypi-libarchive_c
|
||||||
pypi-libevdev
|
pypi-libevdev
|
||||||
@@ -4183,6 +4248,7 @@ pypi-mutagen
|
|||||||
pypi-mypy_extensions
|
pypi-mypy_extensions
|
||||||
pypi-myst_nb
|
pypi-myst_nb
|
||||||
pypi-myst_parser
|
pypi-myst_parser
|
||||||
|
pypi-narwhals
|
||||||
pypi-natsort
|
pypi-natsort
|
||||||
pypi-nbclassic
|
pypi-nbclassic
|
||||||
pypi-nbclient
|
pypi-nbclient
|
||||||
@@ -4191,12 +4257,14 @@ pypi-nbformat
|
|||||||
pypi-nbsphinx
|
pypi-nbsphinx
|
||||||
pypi-nbval
|
pypi-nbval
|
||||||
pypi-ndg_httpsclient
|
pypi-ndg_httpsclient
|
||||||
|
pypi-ndindex
|
||||||
pypi-neat_python
|
pypi-neat_python
|
||||||
pypi-nest_asyncio
|
pypi-nest_asyncio
|
||||||
pypi-netapp_lib
|
pypi-netapp_lib
|
||||||
pypi-netdisco
|
pypi-netdisco
|
||||||
pypi-netifaces
|
pypi-netifaces
|
||||||
pypi-networkx
|
pypi-networkx
|
||||||
|
pypi-nftables
|
||||||
pypi-nh3
|
pypi-nh3
|
||||||
pypi-nibabel
|
pypi-nibabel
|
||||||
pypi-nltk
|
pypi-nltk
|
||||||
@@ -4208,6 +4276,7 @@ pypi-numexpr
|
|||||||
pypi-numpoly
|
pypi-numpoly
|
||||||
pypi-numpy
|
pypi-numpy
|
||||||
pypi-numpydoc
|
pypi-numpydoc
|
||||||
|
pypi-nvidia_ml_py
|
||||||
pypi-oauth2client
|
pypi-oauth2client
|
||||||
pypi-oauthlib
|
pypi-oauthlib
|
||||||
pypi-olefile
|
pypi-olefile
|
||||||
@@ -4217,6 +4286,7 @@ pypi-openshift
|
|||||||
pypi-openstep_plist
|
pypi-openstep_plist
|
||||||
pypi-opt_einsum
|
pypi-opt_einsum
|
||||||
pypi-ordered_set
|
pypi-ordered_set
|
||||||
|
pypi-orjson
|
||||||
pypi-ouimeaux
|
pypi-ouimeaux
|
||||||
pypi-outcome
|
pypi-outcome
|
||||||
pypi-overrides
|
pypi-overrides
|
||||||
@@ -4247,6 +4317,7 @@ pypi-pbs_installer
|
|||||||
pypi-pdfminer.six
|
pypi-pdfminer.six
|
||||||
pypi-pdm
|
pypi-pdm
|
||||||
pypi-pdm_backend
|
pypi-pdm_backend
|
||||||
|
pypi-pdm_build_locked
|
||||||
pypi-pdm_pep517
|
pypi-pdm_pep517
|
||||||
pypi-pecan
|
pypi-pecan
|
||||||
pypi-ped
|
pypi-ped
|
||||||
@@ -4282,6 +4353,7 @@ pypi-poetry
|
|||||||
pypi-poetry_core
|
pypi-poetry_core
|
||||||
pypi-poetry_plugin_export
|
pypi-poetry_plugin_export
|
||||||
pypi-polib
|
pypi-polib
|
||||||
|
pypi-polyleven
|
||||||
pypi-port_for
|
pypi-port_for
|
||||||
pypi-portalocker
|
pypi-portalocker
|
||||||
pypi-portend
|
pypi-portend
|
||||||
@@ -4295,6 +4367,7 @@ pypi-progress
|
|||||||
pypi-progressbar
|
pypi-progressbar
|
||||||
pypi-prometheus_client
|
pypi-prometheus_client
|
||||||
pypi-prompt_toolkit
|
pypi-prompt_toolkit
|
||||||
|
pypi-propcache
|
||||||
pypi-proto_plus
|
pypi-proto_plus
|
||||||
pypi-protobuf
|
pypi-protobuf
|
||||||
pypi-psautohint
|
pypi-psautohint
|
||||||
@@ -4316,12 +4389,14 @@ pypi-pybind11
|
|||||||
pypi-pybtex
|
pypi-pybtex
|
||||||
pypi-pybtex_docutils
|
pypi-pybtex_docutils
|
||||||
pypi-pycares
|
pypi-pycares
|
||||||
|
pypi-pyclip
|
||||||
pypi-pyclipper
|
pypi-pyclipper
|
||||||
pypi-pycodestyle
|
pypi-pycodestyle
|
||||||
pypi-pycollada
|
pypi-pycollada
|
||||||
pypi-pycosat
|
pypi-pycosat
|
||||||
pypi-pycountry
|
pypi-pycountry
|
||||||
pypi-pycparser
|
pypi-pycparser
|
||||||
|
pypi-pycrdt
|
||||||
pypi-pycryptodome
|
pypi-pycryptodome
|
||||||
pypi-pycryptodomex
|
pypi-pycryptodomex
|
||||||
pypi-pycups
|
pypi-pycups
|
||||||
@@ -4347,7 +4422,6 @@ pypi-pylint
|
|||||||
pypi-pymdown_extensions
|
pypi-pymdown_extensions
|
||||||
pypi-pynacl
|
pypi-pynacl
|
||||||
pypi-pynetbox
|
pypi-pynetbox
|
||||||
pypi-pynsist
|
|
||||||
pypi-pynvml
|
pypi-pynvml
|
||||||
pypi-pyomo
|
pypi-pyomo
|
||||||
pypi-pyopengl
|
pypi-pyopengl
|
||||||
@@ -4360,7 +4434,6 @@ pypi-pypresence
|
|||||||
pypi-pyproject_api
|
pypi-pyproject_api
|
||||||
pypi-pyproject_hooks
|
pypi-pyproject_hooks
|
||||||
pypi-pyproject_metadata
|
pypi-pyproject_metadata
|
||||||
pypi-pyprojectx
|
|
||||||
pypi-pypsrp
|
pypi-pypsrp
|
||||||
pypi-pyqrcode
|
pypi-pyqrcode
|
||||||
pypi-pyqt5_sip
|
pypi-pyqt5_sip
|
||||||
@@ -4438,6 +4511,7 @@ pypi-rapidfuzz
|
|||||||
pypi-rapidfuzz_capi
|
pypi-rapidfuzz_capi
|
||||||
pypi-rcssmin
|
pypi-rcssmin
|
||||||
pypi-rdflib
|
pypi-rdflib
|
||||||
|
pypi-re2
|
||||||
pypi-readme_renderer
|
pypi-readme_renderer
|
||||||
pypi-readtime
|
pypi-readtime
|
||||||
pypi-recommonmark
|
pypi-recommonmark
|
||||||
@@ -4447,7 +4521,6 @@ pypi-regress
|
|||||||
pypi-reportlab
|
pypi-reportlab
|
||||||
pypi-repoze.lru
|
pypi-repoze.lru
|
||||||
pypi-requests
|
pypi-requests
|
||||||
pypi-requests_download
|
|
||||||
pypi-requests_file
|
pypi-requests_file
|
||||||
pypi-requests_gssapi
|
pypi-requests_gssapi
|
||||||
pypi-requests_kerberos
|
pypi-requests_kerberos
|
||||||
@@ -4463,7 +4536,6 @@ pypi-retrolab
|
|||||||
pypi-retry
|
pypi-retry
|
||||||
pypi-retry_decorator
|
pypi-retry_decorator
|
||||||
pypi-retryz
|
pypi-retryz
|
||||||
pypi-retype
|
|
||||||
pypi-rfc3339_validator
|
pypi-rfc3339_validator
|
||||||
pypi-rfc3986
|
pypi-rfc3986
|
||||||
pypi-rfc3986_validator
|
pypi-rfc3986_validator
|
||||||
@@ -4572,6 +4644,7 @@ pypi-subprocess_tee
|
|||||||
pypi-suds
|
pypi-suds
|
||||||
pypi-sure
|
pypi-sure
|
||||||
pypi-svg.path
|
pypi-svg.path
|
||||||
|
pypi-tables
|
||||||
pypi-tabulate
|
pypi-tabulate
|
||||||
pypi-tap.py
|
pypi-tap.py
|
||||||
pypi-tblib
|
pypi-tblib
|
||||||
@@ -4586,9 +4659,11 @@ pypi-text_unidecode
|
|||||||
pypi-textdistance
|
pypi-textdistance
|
||||||
pypi-textfsm
|
pypi-textfsm
|
||||||
pypi-texttable
|
pypi-texttable
|
||||||
|
pypi-thefuzz
|
||||||
pypi-threadpoolctl
|
pypi-threadpoolctl
|
||||||
pypi-three_merge
|
pypi-three_merge
|
||||||
pypi-tifffile
|
pypi-tifffile
|
||||||
|
pypi-timm
|
||||||
pypi-tinycss2
|
pypi-tinycss2
|
||||||
pypi-tldextract
|
pypi-tldextract
|
||||||
pypi-tokenizers
|
pypi-tokenizers
|
||||||
@@ -4598,12 +4673,12 @@ pypi-tomli_w
|
|||||||
pypi-tomlkit
|
pypi-tomlkit
|
||||||
pypi-toolz
|
pypi-toolz
|
||||||
pypi-torchmetrics
|
pypi-torchmetrics
|
||||||
|
pypi-torchvision
|
||||||
pypi-tornado
|
pypi-tornado
|
||||||
pypi-tornado_xstatic
|
pypi-tornado_xstatic
|
||||||
pypi-tox
|
pypi-tox
|
||||||
pypi-tqdm
|
pypi-tqdm
|
||||||
pypi-traitlets
|
pypi-traitlets
|
||||||
pypi-trampolim
|
|
||||||
pypi-transformers
|
pypi-transformers
|
||||||
pypi-translationstring
|
pypi-translationstring
|
||||||
pypi-trimesh
|
pypi-trimesh
|
||||||
@@ -4613,7 +4688,6 @@ pypi-trove_classifiers
|
|||||||
pypi-truststore
|
pypi-truststore
|
||||||
pypi-ttp
|
pypi-ttp
|
||||||
pypi-twine
|
pypi-twine
|
||||||
pypi-typed_ast
|
|
||||||
pypi-typeguard
|
pypi-typeguard
|
||||||
pypi-types_cffi
|
pypi-types_cffi
|
||||||
pypi-types_colorama
|
pypi-types_colorama
|
||||||
@@ -4644,7 +4718,6 @@ pypi-tzdata
|
|||||||
pypi-tzlocal
|
pypi-tzlocal
|
||||||
pypi-ua_parser
|
pypi-ua_parser
|
||||||
pypi-uc_micro_py
|
pypi-uc_micro_py
|
||||||
pypi-ufo2ft
|
|
||||||
pypi-ufolib2
|
pypi-ufolib2
|
||||||
pypi-uharfbuzz
|
pypi-uharfbuzz
|
||||||
pypi-ujson
|
pypi-ujson
|
||||||
@@ -4776,8 +4849,10 @@ qemu
|
|||||||
qemu-guest-additions
|
qemu-guest-additions
|
||||||
qgit
|
qgit
|
||||||
qhull
|
qhull
|
||||||
|
qmapshack
|
||||||
qml-box2d
|
qml-box2d
|
||||||
qpdf
|
qpdf
|
||||||
|
qpl
|
||||||
qqc2-desktop-style
|
qqc2-desktop-style
|
||||||
qrencode
|
qrencode
|
||||||
qscintilla
|
qscintilla
|
||||||
@@ -4875,7 +4950,6 @@ re2c
|
|||||||
readline
|
readline
|
||||||
rebootmgr
|
rebootmgr
|
||||||
recode
|
recode
|
||||||
redis-native
|
|
||||||
redis2-nginx-module
|
redis2-nginx-module
|
||||||
redland
|
redland
|
||||||
redsocks
|
redsocks
|
||||||
@@ -4890,6 +4964,7 @@ rng-tools
|
|||||||
robin-map
|
robin-map
|
||||||
roboto
|
roboto
|
||||||
rofi
|
rofi
|
||||||
|
routino
|
||||||
rpcbind
|
rpcbind
|
||||||
rpcsvc-proto
|
rpcsvc-proto
|
||||||
rpm
|
rpm
|
||||||
@@ -4911,6 +4986,7 @@ s3fs-fuse
|
|||||||
salt
|
salt
|
||||||
samba
|
samba
|
||||||
samtools
|
samtools
|
||||||
|
sane-airscan
|
||||||
sane-backends
|
sane-backends
|
||||||
sassc
|
sassc
|
||||||
sbc
|
sbc
|
||||||
@@ -4923,6 +4999,7 @@ scour
|
|||||||
scowl
|
scowl
|
||||||
screen
|
screen
|
||||||
scummvm
|
scummvm
|
||||||
|
scx
|
||||||
sddm
|
sddm
|
||||||
sddm-kcm
|
sddm-kcm
|
||||||
seahorse
|
seahorse
|
||||||
@@ -4954,6 +5031,7 @@ slurm
|
|||||||
smartmontools
|
smartmontools
|
||||||
smemstat
|
smemstat
|
||||||
snappy
|
snappy
|
||||||
|
snapshot
|
||||||
sndio
|
sndio
|
||||||
socat
|
socat
|
||||||
socket.io-client-cpp
|
socket.io-client-cpp
|
||||||
@@ -5033,7 +5111,9 @@ tallow
|
|||||||
tar
|
tar
|
||||||
taskwarrior
|
taskwarrior
|
||||||
tbb
|
tbb
|
||||||
|
tbtools
|
||||||
tcl
|
tcl
|
||||||
|
tclx
|
||||||
tcpdump
|
tcpdump
|
||||||
tdb
|
tdb
|
||||||
tecla
|
tecla
|
||||||
@@ -5064,6 +5144,7 @@ tig
|
|||||||
tigervnc
|
tigervnc
|
||||||
time
|
time
|
||||||
tini
|
tini
|
||||||
|
tinyxml2
|
||||||
tiptop
|
tiptop
|
||||||
tk
|
tk
|
||||||
tmux
|
tmux
|
||||||
@@ -5101,7 +5182,6 @@ usb-modeswitch-data
|
|||||||
usbredir
|
usbredir
|
||||||
usbutils
|
usbutils
|
||||||
userspace-rcu
|
userspace-rcu
|
||||||
usrbinjava
|
|
||||||
usrbinvi
|
usrbinvi
|
||||||
usrsctp
|
usrsctp
|
||||||
utf8proc
|
utf8proc
|
||||||
@@ -5114,7 +5194,10 @@ v4l-utils
|
|||||||
vala
|
vala
|
||||||
valgrind
|
valgrind
|
||||||
valijson
|
valijson
|
||||||
|
valkey
|
||||||
|
vapoursynth
|
||||||
vbox-integration
|
vbox-integration
|
||||||
|
vectorscan
|
||||||
vid.stab
|
vid.stab
|
||||||
vifm
|
vifm
|
||||||
vim
|
vim
|
||||||
@@ -5127,12 +5210,14 @@ virt-manager
|
|||||||
virt-viewer
|
virt-viewer
|
||||||
vkd3d
|
vkd3d
|
||||||
vlc
|
vlc
|
||||||
|
volk
|
||||||
volume_key
|
volume_key
|
||||||
vpnc
|
vpnc
|
||||||
vsqlite
|
vsqlite
|
||||||
vte
|
vte
|
||||||
waffle
|
waffle
|
||||||
wavpack
|
wavpack
|
||||||
|
waydroid
|
||||||
wayland
|
wayland
|
||||||
wayland-protocols
|
wayland-protocols
|
||||||
waypipe
|
waypipe
|
||||||
@@ -5146,10 +5231,12 @@ wget
|
|||||||
which
|
which
|
||||||
whois
|
whois
|
||||||
wine
|
wine
|
||||||
|
winegui
|
||||||
wireless-regdb-master
|
wireless-regdb-master
|
||||||
wireplumber
|
wireplumber
|
||||||
wireshark
|
wireshark
|
||||||
wl-clipboard
|
wl-clipboard
|
||||||
|
wlrobs
|
||||||
wlroots
|
wlroots
|
||||||
wmctrl
|
wmctrl
|
||||||
woff2
|
woff2
|
||||||
@@ -5167,6 +5254,7 @@ xapian-core
|
|||||||
xastir
|
xastir
|
||||||
xauth
|
xauth
|
||||||
xbitmaps
|
xbitmaps
|
||||||
|
xboxdrv
|
||||||
xcb-proto
|
xcb-proto
|
||||||
xcb-util-cursor
|
xcb-util-cursor
|
||||||
xcb-util-xrm
|
xcb-util-xrm
|
||||||
@@ -5239,10 +5327,12 @@ xrandr
|
|||||||
xrdb
|
xrdb
|
||||||
xrdp
|
xrdp
|
||||||
xrestop
|
xrestop
|
||||||
|
xscorch
|
||||||
xscreensaver
|
xscreensaver
|
||||||
xsel
|
xsel
|
||||||
xset
|
xset
|
||||||
xsetroot
|
xsetroot
|
||||||
|
xsimd
|
||||||
xss-lock
|
xss-lock
|
||||||
xterm
|
xterm
|
||||||
xtrans
|
xtrans
|
||||||
|
|||||||
@@ -9,9 +9,8 @@ import subprocess
|
|||||||
import tempfile
|
import tempfile
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from git import Repo
|
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
from git import Repo
|
||||||
|
|
||||||
|
|
||||||
def vendor_check():
|
def vendor_check():
|
||||||
@@ -51,16 +50,17 @@ def setup_content(url):
|
|||||||
|
|
||||||
|
|
||||||
def setup_cargo_vendor(path):
|
def setup_cargo_vendor(path):
|
||||||
|
cargo_paths = []
|
||||||
for dirpath, _, files in os.walk(path):
|
for dirpath, _, files in os.walk(path):
|
||||||
for fname in files:
|
for fname in files:
|
||||||
if fname == "Cargo.toml":
|
if fname == "Cargo.toml":
|
||||||
return dirpath
|
cargo_paths.append(os.path.join(dirpath, fname))
|
||||||
return False
|
return cargo_paths
|
||||||
|
|
||||||
|
|
||||||
def update_cargo_vendor(path, name, git):
|
def update_cargo_vendor(tmpdir, cargo_paths, name, git):
|
||||||
git_uri = os.path.join(git, name)
|
git_uri = os.path.join(git, name)
|
||||||
vendor_path = os.path.join(path, 'vendor')
|
vendor_path = os.path.join(tmpdir, 'vendor')
|
||||||
subprocess.run(f"git clone {git_uri} {vendor_path}", shell=True, check=True,
|
subprocess.run(f"git clone {git_uri} {vendor_path}", shell=True, check=True,
|
||||||
stdout=subprocess.DEVNULL)
|
stdout=subprocess.DEVNULL)
|
||||||
vendor_git = os.path.join(vendor_path, '.git')
|
vendor_git = os.path.join(vendor_path, '.git')
|
||||||
@@ -70,17 +70,26 @@ def update_cargo_vendor(path, name, git):
|
|||||||
stdout=subprocess.DEVNULL)
|
stdout=subprocess.DEVNULL)
|
||||||
subprocess.run(f"git remote add origin {git_uri}", cwd=vendor_path,
|
subprocess.run(f"git remote add origin {git_uri}", cwd=vendor_path,
|
||||||
shell=True, check=True, stdout=subprocess.DEVNULL)
|
shell=True, check=True, stdout=subprocess.DEVNULL)
|
||||||
backup_vendor_git = os.path.join(path, 'clear-linux-vendor-git')
|
backup_vendor_git = os.path.join(tmpdir, 'clear-linux-vendor-git')
|
||||||
subprocess.run(f"cp -a {vendor_git} {backup_vendor_git}", cwd=path,
|
subprocess.run(f"cp -a {vendor_git} {backup_vendor_git}", cwd=tmpdir,
|
||||||
shell=True, check=True, stdout=subprocess.DEVNULL)
|
shell=True, check=True, stdout=subprocess.DEVNULL)
|
||||||
shutil.rmtree(vendor_path)
|
shutil.rmtree(vendor_path)
|
||||||
subprocess.run('cargo vendor', cwd=path, shell=True, check=True,
|
vendor_cmd = 'cargo vendor ' + ' '.join([f"-s {x}" for x in cargo_paths[:-1]])
|
||||||
stdout=subprocess.DEVNULL)
|
vendor_cmd += f" --manifest-path {cargo_paths[-1]}"
|
||||||
subprocess.run(f"cp -a {backup_vendor_git} {vendor_git}", cwd=path,
|
cargo_vendors = subprocess.run(vendor_cmd, cwd=tmpdir, shell=True,
|
||||||
|
check=True, stdout=subprocess.PIPE,
|
||||||
|
universal_newlines=True).stdout
|
||||||
|
with open(os.path.join(vendor_path, ".gitattributes"), "w", encoding='utf8') as gafile:
|
||||||
|
gafile.write("* text=false\n")
|
||||||
|
subprocess.run(f"cp -a {backup_vendor_git} {vendor_git}", cwd=tmpdir,
|
||||||
shell=True, check=True, stdout=subprocess.DEVNULL)
|
shell=True, check=True, stdout=subprocess.DEVNULL)
|
||||||
repo = Repo(vendor_path)
|
repo = Repo(vendor_path)
|
||||||
if not (len(repo.untracked_files) > 0 or repo.is_dirty()):
|
if not (len(repo.untracked_files) > 0 or repo.is_dirty()):
|
||||||
return False
|
# Always use the newest tag as sometimes a new tag will
|
||||||
|
# be created but the package won't be updated to use it
|
||||||
|
# for a different failure reason.
|
||||||
|
tag = sorted(repo.tags, key=lambda x: x.name, reverse=True)[0]
|
||||||
|
return tag, cargo_vendors
|
||||||
subprocess.run('git add .', cwd=vendor_path, shell=True, check=True,
|
subprocess.run('git add .', cwd=vendor_path, shell=True, check=True,
|
||||||
stdout=subprocess.DEVNULL)
|
stdout=subprocess.DEVNULL)
|
||||||
subprocess.run('git commit -m "vendor update"', cwd=vendor_path,
|
subprocess.run('git commit -m "vendor update"', cwd=vendor_path,
|
||||||
@@ -92,10 +101,10 @@ def update_cargo_vendor(path, name, git):
|
|||||||
subprocess.run(f"git push origin main:main {tag}", cwd=vendor_path,
|
subprocess.run(f"git push origin main:main {tag}", cwd=vendor_path,
|
||||||
shell=True, check=True, stdout=subprocess.DEVNULL)
|
shell=True, check=True, stdout=subprocess.DEVNULL)
|
||||||
time.sleep(30)
|
time.sleep(30)
|
||||||
return tag
|
return tag, cargo_vendors
|
||||||
|
|
||||||
|
|
||||||
def update_cargo_sources(name, tag):
|
def update_cargo_sources(name, tag, cargo_vendors):
|
||||||
makefile = []
|
makefile = []
|
||||||
options = []
|
options = []
|
||||||
archive_match = os.path.join(r'\$\(CGIT_BASE_URL\)', 'vendor', name,
|
archive_match = os.path.join(r'\$\(CGIT_BASE_URL\)', 'vendor', name,
|
||||||
@@ -105,11 +114,11 @@ def update_cargo_sources(name, tag):
|
|||||||
with open('Makefile', encoding='utf8') as mfile:
|
with open('Makefile', encoding='utf8') as mfile:
|
||||||
for line in mfile.readlines():
|
for line in mfile.readlines():
|
||||||
if line.startswith('ARCHIVES'):
|
if line.startswith('ARCHIVES'):
|
||||||
if re.search(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.xz', line):
|
if re.search(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.gz', line):
|
||||||
new_archives = re.sub(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.xz',
|
new_archives = re.sub(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.gz',
|
||||||
f"{archive_replace}-{tag}.tar.xz", line)
|
f"{archive_replace}-{tag}.tar.gz", line)
|
||||||
else:
|
else:
|
||||||
new_archives = f"{line[:-1]} {archive_replace}-{tag}.tar.xz ./vendor\n"
|
new_archives = f"{line[:-1]} {archive_replace}-{tag}.tar.gz ./vendor\n"
|
||||||
print(new_archives.replace('ARCHIVES = ', '', 1))
|
print(new_archives.replace('ARCHIVES = ', '', 1))
|
||||||
makefile.append(new_archives)
|
makefile.append(new_archives)
|
||||||
else:
|
else:
|
||||||
@@ -122,20 +131,21 @@ def update_cargo_sources(name, tag):
|
|||||||
with open('options.conf', encoding='utf8') as ofile:
|
with open('options.conf', encoding='utf8') as ofile:
|
||||||
for line in ofile.readlines():
|
for line in ofile.readlines():
|
||||||
if line.startswith('archives'):
|
if line.startswith('archives'):
|
||||||
if re.search(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.xz', line):
|
if re.search(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.gz', line):
|
||||||
new_archives = re.sub(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.xz',
|
new_archives = re.sub(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.gz',
|
||||||
f"{archive_match}-{tag}.tar.xz", line)
|
f"{archive_match}-{tag}.tar.gz", line)
|
||||||
else:
|
else:
|
||||||
new_archives = f"{line[:-1]} {archive_match}-{tag}.tar.xz ./vendor\n"
|
new_archives = f"{line[:-1]} {archive_match}-{tag}.tar.gz ./vendor\n"
|
||||||
options.append(new_archives)
|
options.append(new_archives)
|
||||||
else:
|
else:
|
||||||
options.append(line)
|
options.append(line)
|
||||||
with open('options.conf', 'w', encoding='utf8') as ofile:
|
with open('options.conf', 'w', encoding='utf8') as ofile:
|
||||||
ofile.writelines(options)
|
ofile.writelines(options)
|
||||||
|
with open('cargo_vendors', 'w', encoding='utf8') as cfile:
|
||||||
|
cfile.write(cargo_vendors)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
updated = False
|
|
||||||
args = get_args()
|
args = get_args()
|
||||||
|
|
||||||
vtype = vendor_check()
|
vtype = vendor_check()
|
||||||
@@ -145,14 +155,12 @@ def main():
|
|||||||
|
|
||||||
tdir = setup_content(args.url)
|
tdir = setup_content(args.url)
|
||||||
if vtype == 'cargo':
|
if vtype == 'cargo':
|
||||||
vdir = setup_cargo_vendor(tdir)
|
cargo_paths = setup_cargo_vendor(tdir)
|
||||||
if vdir:
|
if len(cargo_paths) == 0:
|
||||||
tag = update_cargo_vendor(vdir, args.name, args.git)
|
print(args.archives)
|
||||||
if tag:
|
else:
|
||||||
update_cargo_sources(args.name, tag)
|
tag, cargo_vendors = update_cargo_vendor(tdir, cargo_paths, args.name, args.git)
|
||||||
updated = True
|
update_cargo_sources(args.name, tag, cargo_vendors)
|
||||||
if not updated:
|
|
||||||
print(args.archives)
|
|
||||||
shutil.rmtree(tdir)
|
shutil.rmtree(tdir)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user