Compare commits

..

36 Commits

Author SHA1 Message Date
Arjan van de Ven da6bc31e4a update packages file 2025-01-17 14:49:29 +00:00
Arjan van de Ven c360ffe52c update packages file 2025-01-09 19:17:51 +00:00
Arjan van de Ven f092f66d8d update packages file 2024-12-19 06:03:26 +00:00
Brett T. Warden 704e8c90b8 Cleanup parsing of version from specfile in catchup targets
Make sure we only parse %{version} one time while doing a catchup.
2024-12-05 17:11:40 -08:00
Brett T. Warden 1ca80a16a3 Implement catchup targets
Implement a new target 'catchup' that will backport upstream commits
from the current package version to HEAD.
Implement a new target 'catchup-<commit|tag>' that will backport
upstream commits up to the target, as resolvable by git. This powers
'catchup'.
Rework the target 'backport-<commit>' to clone and use the upstream
git repository instead of using GitHub URLs. This also simplifies the
resolution of targets to full commit hashes, as needed to ensure unique
patch names and entries in 'series'.

'make catchup' will backport all the patches to catch this package up to
the upstream's HEAD
'make catchup-v5.0' will backport all the patches to catch this package
up to tag "v5.0" upstream.
'make catchup-ffdcba' will backport all the patches between this
package's current version and the upstream commit ffdcba.
'make backport-ffdcba' will backport ONLY upstream commit ffdcba.

All targets will produce patches named "backport-<commit>.patch", where
<commit> is the full SHA1 commit hash, regardless of whether you used an
abbreviated hash (or a tag, for catchup-%).

Patches are added to 'series' in chronological order, unless they're
already anywhere in that file.
2024-12-05 16:00:31 -08:00
Arjan van de Ven 27e359bda0 update packages file 2024-12-05 19:57:20 +00:00
Brett T. Warden 3db02dd609 Implement backport-<commit> target
For packages with a GitHub repo configured in options.conf, allow
downloading and applying backport patches via the 'backport-<commit>'
target. If given an abbreviated commit ID, it will still create a
backport-<commit>.patch file with the full commit hash, plus add it (if
it does not already exist) to the end of the series file.

Because this handles a single commit at a time, this should be wrappable
by a future Makefile target that applies individual commits to catch up
to a target tag, for example.
2024-12-02 16:13:06 -08:00
Arjan van de Ven 5866d7afbf update packages file 2024-11-25 21:15:54 +00:00
Arjan van de Ven 437d1ee01a update packages file 2024-11-13 17:16:18 +00:00
Arjan van de Ven cb5d78bb2f update packages file 2024-11-05 04:43:02 +00:00
William Douglas 9bfaefc491 Add support for multiple Cargo.toml files
Some projects store multiple Cargo.toml files, let vendor handle all
of them (might be worth having some config for certain Cargo.toml
paths to skip in the future though).

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-10-31 10:30:24 -07:00
Arjan van de Ven 64a20fa5c2 update packages file 2024-10-24 18:55:47 +00:00
Arjan van de Ven e0b152250f use gz not xz 2024-10-22 15:39:37 +00:00
Arjan van de Ven 70ca088ce6 update packages file 2024-10-18 19:19:02 +00:00
Arjan van de Ven a3c7b734fa packages update 2024-10-17 15:08:53 +00:00
Arjan van de Ven 7ff8c3a6d5 update packages file 2024-10-15 13:47:25 +00:00
William Douglas bdac11063e bump target: Stash repo first
In order to prevent content that wasn't committed from working its way
into a build, stash prior to doing the rest of the bump.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-10-10 11:47:15 -07:00
Arjan van de Ven 52f73c1530 packages update 2024-09-20 15:00:40 +00:00
Arjan van de Ven 072d9b81a2 packages update 2024-09-11 17:01:52 +00:00
Brett T. Warden 85a3e1cd32 Add libpng-2.0 license 2024-09-11 08:38:47 -07:00
William Douglas 3bf41ad9c9 Update vendor script to always use the latest tag
Sometimes vendor repos get tagged but the package fails to update for
another reason. In this case the repo wouldn't have the new vendor
ARCHIVE set and new attempts to build would use the old vendor archive
causing failures. Force using the latest vendor tag as generally this
is what we want (if we get a bad vendor tag somehow, it should mean a
new tag needs to be created to replace it anyway).

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-09-06 13:12:13 -07:00
Arjan van de Ven 92b3d682ec udpate 2024-08-22 18:35:05 +00:00
Arjan van de Ven ce873b4b19 packages update 2024-08-20 15:16:40 +00:00
Arjan van de Ven 463112629b packages update 2024-08-13 15:18:01 +00:00
Arjan van de Ven 0fd1fc5a1d packages update 2024-07-30 16:29:55 +00:00
William Douglas 0e9a2b7e82 Force git attributes for vendor directories
Avoid cases where user git settings cause files to have different line
endings than the package and cause hash mismatches when building.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-25 12:45:07 -07:00
William Douglas 398fb69708 Always remove the pumpAutospec file
Remove pumpAutospec even if the package hasn't yet become a git repo
yet.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-24 15:36:47 -07:00
William Douglas cdcb8aa9d8 Switch to git rm for removing the autospec log file
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-22 16:38:33 -07:00
Arjan van de Ven 3168ba058e update 2024-07-22 23:22:51 +00:00
William Douglas 76fef57d5b Add env var for autospec logging
Add environment variable that autospec uses to decide when to log
fatal errors to a special file used for the update process.

Also does the cleanup of the autospec created file for new autospec
runs.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-22 16:20:55 -07:00
Arjan van de Ven 59ea0b102e new packages file 2024-07-09 18:23:06 +00:00
William Douglas e4c604a161 Export the output of cargo vendor
autospec learned how to use 'cargo vendor' output as a drop in
configuration file so put the output of cargo vendor there.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-08 15:11:34 -07:00
William Douglas 59c4520f37 Fix import order
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-08 14:07:10 -07:00
William Douglas 16f813a390 Add support for update.first
Add additional capability for update target to read a package's
update.first file that will run make update on each of the packages
included in that file.

The intended usage model is for packages that need to be updated in
order to specify that order via the update.first (the packages are
updated in the order specified unless a package in the list also has
an update.first file).

As part of this change, force the update target to always build in
koji synchronously to avoid issues where the update being depended on
isn't finished in koji.

Loops are not supported and will cause problems.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-03 15:03:11 -07:00
William Douglas 79eebc6aa6 Remove autospecnewgo target and its component parts
This wasn't a practical target and is no longer used so remove it.

Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-03 13:33:17 -07:00
William Douglas d1accc8077 Fix CLEANUP option handling for autospecnew target
Signed-off-by: William Douglas <william.douglas@intel.com>
2024-07-03 11:34:09 -07:00
6 changed files with 237 additions and 408 deletions
+82 -20
View File
@@ -166,6 +166,7 @@ preautospec-checks:
#help to autospec.
#help For more information, see the project at https://github.com/clearlinux/autospec
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 \
echo "Specfile already exists and was not created by autospec.py! Aborting."; \
exit 1; \
@@ -222,6 +223,7 @@ scanlicense:
#help the variable BUMP_MSG is set, its value is used as the commit summary.
#help Otherwise a generic commit summary is used.
bump:
git stash
git pull --rebase
$(MAKE) bumpnogit
git add $(SPECFILE) release
@@ -406,17 +408,20 @@ update-versions:
#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 update to koji (bumping the bump.list if found).
update: export AUTOSPEC_UPDATE=1
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 \
./update.sh; \
else \
$(MAKE) -s update-versions && \
$(MAKE) autospec CLEANUP=1 && \
if [ -f bump.list ]; then \
$(MAKE) -s koji; \
else \
$(MAKE) -s koji-nowait; \
fi \
$(MAKE) -s koji && \
$(MAKE) koji-waitrepo; \
fi \
logcheck:
@@ -440,21 +445,6 @@ repoadd: $(TOPLVL)/repo
$(MAKE) -s localrepocreate
$(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 previously added by 'make repoadd' for this package.
repodel: $(TOPLVL)/repo
@@ -592,6 +582,78 @@ cloc: $(SRPMFILE)
@$(MOCK) --clean --scrub=chroot --uniqueext=$(PKG_NAME)
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
#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
+1 -46
View File
@@ -237,7 +237,7 @@ autospecnew: preautospecnew-checks localreponotice
--mock-config $(MOCK_CONFIG_VAL) \
--mock-opts="$(MOCK_OPTS)" \
$${SETVERSION:+ --version $${SETVERSION}} \
${NON_INTERACTIVE} ${SKIP_GIT} ${CLEANUP} \
${NON_INTERACTIVE} ${SKIP_GIT} $(if $(CLEANUP),-C) \
$(URL); \
if [ $$? -eq 0 ]; then \
$(MAKE) link-new-rpms PKG_REPO_DIR="${TOPLVL}/packages/${NAME}"; \
@@ -256,51 +256,6 @@ autospecnew: preautospecnew-checks localreponotice
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 -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 Mock. If this repository does not yet exist, it is created.
repoenable: localrepoenable ;
-285
View File
@@ -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")
+1
View File
@@ -5,3 +5,4 @@ GFDL-1.3+
MIT-Opengroup
WXwindows
w3c
libpng-2.0
+114 -26
View File
@@ -26,6 +26,7 @@ LibreCAD
Linux-PAM
LuaJIT
LyX
MangoHud
MarkupSafe
ModemManager
MuseScore
@@ -62,6 +63,8 @@ R-BMA
R-BatchJobs
R-BayesFactor
R-BiasedUrn
R-Biobase
R-BiocGenerics
R-BiocManager
R-BoolNet
R-BradleyTerry2
@@ -121,6 +124,7 @@ R-MNP
R-MatchIt
R-Matching
R-MatrixModels
R-MetricsWeighted
R-ModelMetrics
R-NADA
R-NLP
@@ -148,6 +152,7 @@ R-RNetCDF
R-ROCR
R-ROSE
R-RProtoBuf
R-RPushbullet
R-RSQLite
R-RSclient
R-RUnit
@@ -175,6 +180,7 @@ R-Ryacas
R-SGP
R-SGPdata
R-SQUAREM
R-SimDesign
R-Sleuth2
R-SnowballC
R-SparseM
@@ -216,6 +222,7 @@ R-arules
R-ash
R-askpass
R-assertthat
R-audio
R-backports
R-base64enc
R-base64url
@@ -226,6 +233,7 @@ R-bayesplot
R-bazar
R-bbmle
R-bdsmatrix
R-beepr
R-beeswarm
R-bench
R-benchr
@@ -263,6 +271,7 @@ R-calibrator
R-callr
R-car
R-carData
R-cards
R-caret
R-cclust
R-cellranger
@@ -338,6 +347,7 @@ R-distr
R-distrEx
R-distributional
R-dlm
R-doBy
R-doMC
R-doMPI
R-doParallel
@@ -351,6 +361,7 @@ R-drc
R-dreamerr
R-dtplyr
R-dtw
R-duckdb
R-dygraphs
R-dynamicTreeCut
R-dynlm
@@ -656,6 +667,7 @@ R-mvnormtest
R-mvoutlier
R-mvtnorm
R-nanoarrow
R-nanoparquet
R-natserv
R-ncbit
R-ncdf4
@@ -861,6 +873,7 @@ R-rsvg
R-runjags
R-rversions
R-rvest
R-rworldmap
R-s2
R-sampling
R-sandwich
@@ -879,6 +892,7 @@ R-sessioninfo
R-setRNG
R-sets
R-sf
R-sfd
R-sfsmisc
R-sgeostat
R-shape
@@ -914,6 +928,7 @@ R-spatstat.linnet
R-spatstat.model
R-spatstat.random
R-spatstat.sparse
R-spatstat.univar
R-spatstat.utils
R-spc
R-spdep
@@ -963,6 +978,7 @@ R-tibble
R-tidyr
R-tidyrules
R-tidyselect
R-tidytable
R-tidyverse
R-tikzDevice
R-timeDate
@@ -1072,6 +1088,7 @@ WPEBackend-fdo
WireGuard
XStatic-term.js
Z3
aardvark-dns
abireport
abseil-cpp
accel-config
@@ -1103,6 +1120,7 @@ ansible
ansible-core
antlr4-python3-runtime
apache-ant
apache-arrow
appstream
appstream-glib
apr
@@ -1149,7 +1167,10 @@ avahi
awesome-wm
awscli
axel
azure-c-logging
azure-configs
azure-macro-utils-c
azure-umock-c
babeltrace
babl
baloo
@@ -1160,7 +1181,6 @@ bash-completion
bashdb
bats
bc
bcache-tools
bcachefs-tools
bcc
bcftools
@@ -1187,6 +1207,7 @@ boost
borgbackup
boto3
botocore
bottom
bovo
box2d
bpftool
@@ -1217,10 +1238,13 @@ buildreq-qmake
buildreq-qt6
buildreq-scons
buildx
bwidget
byobu
bz2file
bzip2
c-ares
c-blosc
c-blosc2
cJSON
c_rehash
ca-certs
@@ -1246,6 +1270,7 @@ cereal
cfitsio
cgdb
cgit
chafa
check
cheese
chirp
@@ -1299,7 +1324,6 @@ cmocka
cmrt
cmus
cnf
cni
cni-plugins
cockpit
codec2
@@ -1314,19 +1338,23 @@ colord-kde
colordiff
columbiad
compat-Botan-soname2
compat-abseil-cpp-rolling
compat-atkmm-soname16
compat-babeltrace-one
compat-cairomm-soname10
compat-codec2-soname1
compat-enchant-soname1
compat-ffmpeg-4.4
compat-ffmpeg-6
compat-fuse-soname2
compat-gcc-10
compat-gcr-soname1
compat-glibmm-soname24
compat-gnome-bluetooth-soname-13
compat-grpc-soname66
compat-gsl-soname27
compat-gtksourceview-soname3
compat-icu4c-rolling
compat-json-c-soname4
compat-libffi-soname6
compat-libffi-soname7
@@ -1339,6 +1367,7 @@ compat-libvpx-soname8
compat-pangomm-soname14
compat-protobuf-soname29
compat-protobuf-soname32
compat-python3-rolling
compat-re2-soname10
compat-readline-soname5
compat-taglib-soname1
@@ -1380,6 +1409,7 @@ cups-filters
cups-pk-helper
curl
cycler
cyme
cyrus-sasl
dapl
darktable
@@ -1392,6 +1422,7 @@ dbus-glib
dbus-python
dconf
dconf-editor
ddcutil
ddd
deap
debugedit
@@ -1500,8 +1531,10 @@ fakeroot
falcosecurity-libs
fann
farstream
fastfetch
faultstat
fcgi
fd
fdk-aac
fdupes
feh
@@ -1548,7 +1581,6 @@ freeglut
freeipmi
freetype
fribidi
fritzing-app
frozen
fs
fsarchiver
@@ -1556,8 +1588,10 @@ fsearch
fuse
fwupd
fwupd-efi
game-music-emu
garcon
gawk
gbinder-python
gc
gcab
gcc
@@ -1577,8 +1611,6 @@ gdm
geany
geany-plugins
geary
gedit
gedit-plugins-gnome
geeqie
gegl
gengetopt
@@ -1676,6 +1708,9 @@ goaccess
gobject-introspection
golang-github-cpuguy83-go-md2man
goocanvas
google-benchmark
google-cloud-cpp
google-crc32c
googletest
gparted
gpaste
@@ -1739,6 +1774,7 @@ gzip
hamlib
haproxy
hardinfo
hardinfo2
harfbuzz
haveged
hdf5
@@ -1749,6 +1785,7 @@ help2man
hexchat
hexedit
hicolor-icon-theme
highway
hiredis-c
hostname
howdy
@@ -1760,7 +1797,6 @@ hub
hugo
hunspell
hwloc
hyperscan
hyphen
i2c-tools
i3
@@ -1812,6 +1848,7 @@ ipe
iperf
ipmitool
ipp-crypto
ipp-usb
iproute2
ipset
iptables
@@ -1824,6 +1861,7 @@ irrlicht
irrlichtmt
irssi
isa-l
isl
iso-codes
isodate
isomd5sum
@@ -2169,6 +2207,7 @@ libfontenc
libfprint
libfreehand
libftdi1
libgbinder
libgcrypt
libgd
libgdata
@@ -2177,6 +2216,7 @@ libgee
libgeotiff
libgit2
libgit2-glib
libglibutil
libglvnd
libgnome-keyring
libgnomekbd
@@ -2228,6 +2268,7 @@ libmbim
libmediaart
libmemcached
libmicrohttpd
libmikmod
libmnl
libmodbus
libmodplug
@@ -2261,6 +2302,7 @@ libodfgen
libogg
libopenmpt
libopenzwave
libopusenc
liborcus
libosinfo
libpagemaker
@@ -2313,6 +2355,7 @@ libsoup
libspatialindex
libspatialite
libspectre
libspelling
libspiro
libspnav
libspng
@@ -2346,7 +2389,9 @@ libva
libva-intel-driver
libva-utils
libvdpau
libversion
libvirt
libvirt-dbus
libvirt-glib
libvirt-python
libvisio
@@ -2405,6 +2450,8 @@ llvm
llvm14
llvm15
llvm16
llvm17
llvm18
lm-sensors
lmdb
logrotate
@@ -2426,6 +2473,7 @@ luarocks
lutris
luv
lv2
lxc
lynx
lz4
lzlib
@@ -2476,6 +2524,7 @@ micro-config-drive-aws
micro-config-drive-equinix
micro-config-drive-oci
milou
mimalloc
mimetreeparser
minetest
minetest_game
@@ -2503,6 +2552,7 @@ modsecurity
modsecurity-nginx
modules
mokutil
mold
mono
moreutils
mosh
@@ -2511,6 +2561,7 @@ motd-update
motif
mozjs102
mozjs115
mozjs128
mozjs91
mpc
mpfr
@@ -2552,6 +2603,7 @@ neovim
net-snmp
net-tools
netaddr
netavark
netbase
netcdf
netcdf-fortran
@@ -2562,6 +2614,7 @@ nettle
network-manager-applet
networkmanager-qt
newt
nextcloud-desktop
nfs-utils
nftables
nghttp2
@@ -2678,6 +2731,7 @@ parallel
parley
parted
pass
passt
passwdqc
patch
patchelf
@@ -3072,6 +3126,7 @@ perl-IPC-ShareLite
perl-IPC-Shareable
perl-IPC-System-Simple
perl-Image-Base
perl-Image-ExifTool
perl-Image-Info
perl-Image-Size
perl-Image-Xbm
@@ -3425,7 +3480,6 @@ perl-Test-Without-Module
perl-Test-YAML
perl-Test-utf8
perl-Test2-Plugin-NoWarnings
perl-Test2-Suite
perl-Text-Autoformat
perl-Text-Brew
perl-Text-CSV
@@ -3690,6 +3744,7 @@ pynvim
pyotherside
pyotp
pyparted
pypi-Yapps
pypi-absl_py
pypi-abydos
pypi-accelerate
@@ -3697,15 +3752,16 @@ pypi-acme
pypi-adal
pypi-aiodns
pypi-aiofiles
pypi-aiohappyeyeballs
pypi-aiohttp
pypi-aiohttp_cors
pypi-aiosignal
pypi-aiosmtpd
pypi-aiosqlite
pypi-alabaster
pypi-altair
pypi-altgraph
pypi-amqp
pypi-aniso8601
pypi-annotated_types
pypi-ansi2html
pypi-ansible_builder
@@ -3741,7 +3797,6 @@ pypi-atpublic
pypi-attr
pypi-attrdict
pypi-attrs
pypi-autocommand
pypi-automat
pypi-awesomeversion
pypi-awscrt
@@ -3759,7 +3814,6 @@ pypi-babel
pypi-backcall
pypi-backoff
pypi-backports.ssl_match_hostname
pypi-bash_kernel
pypi-bashlex
pypi-bcrypt
pypi-beartype
@@ -3776,6 +3830,8 @@ pypi-blessed
pypi-blinker
pypi-blivet
pypi-blockdiag
pypi-blosc
pypi-blosc2
pypi-bokeh
pypi-boolean.py
pypi-booleanoperations
@@ -3796,14 +3852,12 @@ pypi-cachy
pypi-cairocffi
pypi-cairosvg
pypi-calver
pypi-capturer
pypi-cattrs
pypi-cerberus
pypi-certbot
pypi-certbot_dns_google
pypi-certifi
pypi-cffi
pypi-cffsubr
pypi-cfgv
pypi-chai
pypi-chaospy
@@ -3813,7 +3867,6 @@ pypi-check_jsonschema
pypi-check_manifest
pypi-cheetah3
pypi-cheroot
pypi-cherrypy
pypi-cibuildwheel
pypi-ciscoisesdk
pypi-ciso8601
@@ -3825,11 +3878,11 @@ pypi-click_log
pypi-clikit
pypi-cloudevents
pypi-cloudflare
pypi-clr_artifact
pypi-cmarkgfm
pypi-cmd2
pypi-codecov
pypi-colorama
pypi-coloredlogs
pypi-colorlog
pypi-columnize
pypi-comm
@@ -3842,6 +3895,7 @@ pypi-cons
pypi-contextlib2
pypi-contextvars
pypi-contourpy
pypi-controlnet_aux
pypi-cookiecutter
pypi-coverage
pypi-coverage_enable_subprocess
@@ -3849,6 +3903,7 @@ pypi-coveralls
pypi-cppy
pypi-crashtest
pypi-crcmod
pypi-crypt_r
pypi-cryptography
pypi-cryptography_vectors
pypi-cs
@@ -3859,6 +3914,7 @@ pypi-cu2qu
pypi-curio
pypi-cvss
pypi-cxxfilt
pypi-cysystemd
pypi-cython
pypi-cytoolz
pypi-dacite
@@ -3870,6 +3926,7 @@ pypi-decorator
pypi-deepmerge
pypi-deepspeed
pypi-dep_logic
pypi-dependency_groups
pypi-deprecated
pypi-deprecation
pypi-devpi_client
@@ -3900,12 +3957,17 @@ pypi-docopt
pypi-docstring_parser
pypi-docstring_to_markdown
pypi-docutils
pypi-doit
pypi-doxypypy
pypi-doxyqml
pypi-dpcontracts
pypi-dulwich
pypi-durationpy
pypi-ecdsa
pypi-editables
pypi-editdistance
pypi-edlib
pypi-einops
pypi-elementpath
pypi-enrich
pypi-entrypoints
@@ -3941,6 +4003,7 @@ pypi-flaky
pypi-flask
pypi-flatbuffers
pypi-flatten_json
pypi-flexcache
pypi-flexparser
pypi-flit
pypi-flit_core
@@ -3955,6 +4018,7 @@ pypi-ftfy
pypi-funcparserlib
pypi-future
pypi-gast
pypi-gdown
pypi-gevent
pypi-geventhttpclient
pypi-ghp_import
@@ -4057,10 +4121,8 @@ pypi-isort
pypi-itsdangerous
pypi-janus
pypi-jaraco.classes
pypi-jaraco.collections
pypi-jaraco.context
pypi-jaraco.functools
pypi-jaraco.text
pypi-jarn.viewdoc
pypi-javaproperties
pypi-jedi
@@ -4073,7 +4135,6 @@ pypi-jinxed
pypi-jmespath
pypi-joblib
pypi-josepy
pypi-jsmin
pypi-json5
pypi-jsondiff
pypi-jsonlines
@@ -4101,6 +4162,8 @@ pypi-jupyterlab_link_share
pypi-jupyterlab_pygments
pypi-jupyterlab_server
pypi-jupyterlab_widgets
pypi-jupyterlite_core
pypi-jupyterlite_pyodide_kernel
pypi-jxmlease
pypi-kcc
pypi-kerberos
@@ -4118,6 +4181,7 @@ pypi-lazy
pypi-lazy_loader
pypi-lazy_object_proxy
pypi-ldap3
pypi-legacy_cgi
pypi-levenshtein
pypi-libarchive_c
pypi-libevdev
@@ -4183,6 +4247,7 @@ pypi-mutagen
pypi-mypy_extensions
pypi-myst_nb
pypi-myst_parser
pypi-narwhals
pypi-natsort
pypi-nbclassic
pypi-nbclient
@@ -4191,12 +4256,14 @@ pypi-nbformat
pypi-nbsphinx
pypi-nbval
pypi-ndg_httpsclient
pypi-ndindex
pypi-neat_python
pypi-nest_asyncio
pypi-netapp_lib
pypi-netdisco
pypi-netifaces
pypi-networkx
pypi-nftables
pypi-nh3
pypi-nibabel
pypi-nltk
@@ -4208,6 +4275,7 @@ pypi-numexpr
pypi-numpoly
pypi-numpy
pypi-numpydoc
pypi-nvidia_ml_py
pypi-oauth2client
pypi-oauthlib
pypi-olefile
@@ -4217,6 +4285,7 @@ pypi-openshift
pypi-openstep_plist
pypi-opt_einsum
pypi-ordered_set
pypi-orjson
pypi-ouimeaux
pypi-outcome
pypi-overrides
@@ -4283,6 +4352,7 @@ pypi-poetry
pypi-poetry_core
pypi-poetry_plugin_export
pypi-polib
pypi-polyleven
pypi-port_for
pypi-portalocker
pypi-portend
@@ -4296,6 +4366,7 @@ pypi-progress
pypi-progressbar
pypi-prometheus_client
pypi-prompt_toolkit
pypi-propcache
pypi-proto_plus
pypi-protobuf
pypi-psautohint
@@ -4317,12 +4388,14 @@ pypi-pybind11
pypi-pybtex
pypi-pybtex_docutils
pypi-pycares
pypi-pyclip
pypi-pyclipper
pypi-pycodestyle
pypi-pycollada
pypi-pycosat
pypi-pycountry
pypi-pycparser
pypi-pycrdt
pypi-pycryptodome
pypi-pycryptodomex
pypi-pycups
@@ -4348,7 +4421,6 @@ pypi-pylint
pypi-pymdown_extensions
pypi-pynacl
pypi-pynetbox
pypi-pynsist
pypi-pynvml
pypi-pyomo
pypi-pyopengl
@@ -4361,7 +4433,6 @@ pypi-pypresence
pypi-pyproject_api
pypi-pyproject_hooks
pypi-pyproject_metadata
pypi-pyprojectx
pypi-pypsrp
pypi-pyqrcode
pypi-pyqt5_sip
@@ -4439,6 +4510,7 @@ pypi-rapidfuzz
pypi-rapidfuzz_capi
pypi-rcssmin
pypi-rdflib
pypi-re2
pypi-readme_renderer
pypi-readtime
pypi-recommonmark
@@ -4448,7 +4520,6 @@ pypi-regress
pypi-reportlab
pypi-repoze.lru
pypi-requests
pypi-requests_download
pypi-requests_file
pypi-requests_gssapi
pypi-requests_kerberos
@@ -4464,7 +4535,6 @@ pypi-retrolab
pypi-retry
pypi-retry_decorator
pypi-retryz
pypi-retype
pypi-rfc3339_validator
pypi-rfc3986
pypi-rfc3986_validator
@@ -4573,6 +4643,7 @@ pypi-subprocess_tee
pypi-suds
pypi-sure
pypi-svg.path
pypi-tables
pypi-tabulate
pypi-tap.py
pypi-tblib
@@ -4587,9 +4658,11 @@ pypi-text_unidecode
pypi-textdistance
pypi-textfsm
pypi-texttable
pypi-thefuzz
pypi-threadpoolctl
pypi-three_merge
pypi-tifffile
pypi-timm
pypi-tinycss2
pypi-tldextract
pypi-tokenizers
@@ -4599,12 +4672,12 @@ pypi-tomli_w
pypi-tomlkit
pypi-toolz
pypi-torchmetrics
pypi-torchvision
pypi-tornado
pypi-tornado_xstatic
pypi-tox
pypi-tqdm
pypi-traitlets
pypi-trampolim
pypi-transformers
pypi-translationstring
pypi-trimesh
@@ -4614,7 +4687,6 @@ pypi-trove_classifiers
pypi-truststore
pypi-ttp
pypi-twine
pypi-typed_ast
pypi-typeguard
pypi-types_cffi
pypi-types_colorama
@@ -4645,7 +4717,6 @@ pypi-tzdata
pypi-tzlocal
pypi-ua_parser
pypi-uc_micro_py
pypi-ufo2ft
pypi-ufolib2
pypi-uharfbuzz
pypi-ujson
@@ -4777,8 +4848,10 @@ qemu
qemu-guest-additions
qgit
qhull
qmapshack
qml-box2d
qpdf
qpl
qqc2-desktop-style
qrencode
qscintilla
@@ -4876,7 +4949,6 @@ re2c
readline
rebootmgr
recode
redis-native
redis2-nginx-module
redland
redsocks
@@ -4891,6 +4963,7 @@ rng-tools
robin-map
roboto
rofi
routino
rpcbind
rpcsvc-proto
rpm
@@ -4912,6 +4985,7 @@ s3fs-fuse
salt
samba
samtools
sane-airscan
sane-backends
sassc
sbc
@@ -4924,6 +4998,7 @@ scour
scowl
screen
scummvm
scx
sddm
sddm-kcm
seahorse
@@ -4955,6 +5030,7 @@ slurm
smartmontools
smemstat
snappy
snapshot
sndio
socat
socket.io-client-cpp
@@ -5034,7 +5110,9 @@ tallow
tar
taskwarrior
tbb
tbtools
tcl
tclx
tcpdump
tdb
tecla
@@ -5065,6 +5143,7 @@ tig
tigervnc
time
tini
tinyxml2
tiptop
tk
tmux
@@ -5102,7 +5181,6 @@ usb-modeswitch-data
usbredir
usbutils
userspace-rcu
usrbinjava
usrbinvi
usrsctp
utf8proc
@@ -5115,7 +5193,10 @@ v4l-utils
vala
valgrind
valijson
valkey
vapoursynth
vbox-integration
vectorscan
vid.stab
vifm
vim
@@ -5128,12 +5209,14 @@ virt-manager
virt-viewer
vkd3d
vlc
volk
volume_key
vpnc
vsqlite
vte
waffle
wavpack
waydroid
wayland
wayland-protocols
waypipe
@@ -5147,10 +5230,12 @@ wget
which
whois
wine
winegui
wireless-regdb-master
wireplumber
wireshark
wl-clipboard
wlrobs
wlroots
wmctrl
woff2
@@ -5168,6 +5253,7 @@ xapian-core
xastir
xauth
xbitmaps
xboxdrv
xcb-proto
xcb-util-cursor
xcb-util-xrm
@@ -5240,10 +5326,12 @@ xrandr
xrdb
xrdp
xrestop
xscorch
xscreensaver
xsel
xset
xsetroot
xsimd
xss-lock
xterm
xtrans
+39 -31
View File
@@ -9,9 +9,8 @@ import subprocess
import tempfile
import time
from git import Repo
import requests
from git import Repo
def vendor_check():
@@ -51,16 +50,17 @@ def setup_content(url):
def setup_cargo_vendor(path):
cargo_paths = []
for dirpath, _, files in os.walk(path):
for fname in files:
if fname == "Cargo.toml":
return dirpath
return False
cargo_paths.append(os.path.join(dirpath, fname))
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)
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,
stdout=subprocess.DEVNULL)
vendor_git = os.path.join(vendor_path, '.git')
@@ -70,17 +70,26 @@ def update_cargo_vendor(path, name, git):
stdout=subprocess.DEVNULL)
subprocess.run(f"git remote add origin {git_uri}", cwd=vendor_path,
shell=True, check=True, stdout=subprocess.DEVNULL)
backup_vendor_git = os.path.join(path, 'clear-linux-vendor-git')
subprocess.run(f"cp -a {vendor_git} {backup_vendor_git}", cwd=path,
backup_vendor_git = os.path.join(tmpdir, 'clear-linux-vendor-git')
subprocess.run(f"cp -a {vendor_git} {backup_vendor_git}", cwd=tmpdir,
shell=True, check=True, stdout=subprocess.DEVNULL)
shutil.rmtree(vendor_path)
subprocess.run('cargo vendor', cwd=path, shell=True, check=True,
stdout=subprocess.DEVNULL)
subprocess.run(f"cp -a {backup_vendor_git} {vendor_git}", cwd=path,
vendor_cmd = 'cargo vendor ' + ' '.join([f"-s {x}" for x in cargo_paths[:-1]])
vendor_cmd += f" --manifest-path {cargo_paths[-1]}"
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)
repo = Repo(vendor_path)
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,
stdout=subprocess.DEVNULL)
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,
shell=True, check=True, stdout=subprocess.DEVNULL)
time.sleep(30)
return tag
return tag, cargo_vendors
def update_cargo_sources(name, tag):
def update_cargo_sources(name, tag, cargo_vendors):
makefile = []
options = []
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:
for line in mfile.readlines():
if line.startswith('ARCHIVES'):
if re.search(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.xz', line):
new_archives = re.sub(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.xz',
f"{archive_replace}-{tag}.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\.gz',
f"{archive_replace}-{tag}.tar.gz", line)
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))
makefile.append(new_archives)
else:
@@ -122,20 +131,21 @@ def update_cargo_sources(name, tag):
with open('options.conf', encoding='utf8') as ofile:
for line in ofile.readlines():
if line.startswith('archives'):
if re.search(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.xz', line):
new_archives = re.sub(archive_match + r'[a-zA-Z0-9_\-.]+\.tar\.xz',
f"{archive_match}-{tag}.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\.gz',
f"{archive_match}-{tag}.tar.gz", line)
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)
else:
options.append(line)
with open('options.conf', 'w', encoding='utf8') as ofile:
ofile.writelines(options)
with open('cargo_vendors', 'w', encoding='utf8') as cfile:
cfile.write(cargo_vendors)
def main():
updated = False
args = get_args()
vtype = vendor_check()
@@ -145,14 +155,12 @@ def main():
tdir = setup_content(args.url)
if vtype == 'cargo':
vdir = setup_cargo_vendor(tdir)
if vdir:
tag = update_cargo_vendor(vdir, args.name, args.git)
if tag:
update_cargo_sources(args.name, tag)
updated = True
if not updated:
print(args.archives)
cargo_paths = setup_cargo_vendor(tdir)
if len(cargo_paths) == 0:
print(args.archives)
else:
tag, cargo_vendors = update_cargo_vendor(tdir, cargo_paths, args.name, args.git)
update_cargo_sources(args.name, tag, cargo_vendors)
shutil.rmtree(tdir)