Skip to content

Commit c4ad5dd

Browse files
authored
Merge pull request aurutils#1209 from aurutils/fetch-rebuild
examples/sync-rebuild: use aur-fetch
2 parents c6e143a + 897fc49 commit c4ad5dd

File tree

2 files changed

+63
-46
lines changed

2 files changed

+63
-46
lines changed

examples/README.md

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ clients of the local repository.
111111
Assuming a list of rebuild targets is known, `sync-rebuild` performs the
112112
following steps:
113113

114-
1. Retrieve and inspect all source files with `aur sync`
114+
1. Retrieve and update all source files with `aur fetch --existing`
115115
2. Retrieve all versions of packages in the local repository
116116
3. If `pkgver` matches the local repository version, set `pkgrel` in the
117117
`PKGBUILD` to the local repository version, incremented by `0.1`. Otherwise,
@@ -126,22 +126,33 @@ in case the incremented version is lost, or otherwise restored (e.g. with
126126
`git-reset`). The fractional part is always increased; for example, a `pkgrel`
127127
of `35.9` is increased to `35.10`, not `36`.
128128

129+
> **Note**
130+
> If one dependency fails to build, `sync-rebuild` will try rebuilding the package
131+
> that depends on it anyway. To avoid this, use the `--fail-fast` option.
132+
129133
`aur-repo` can be used to retrieve a list of packages that depend on specific
130134
package. For example:
131135

132136
```bash
133137
aur repo --search '^python.*' --search-by depends --list
134138
```
135139

140+
`aur-sync` can be used to inspect new PKGBUILD revisions beforehand
141+
and retrieve any new dependencies. For example:
142+
143+
```bash
144+
aur sync --no-build --no-ver-argv <targets...>
145+
```
146+
136147
> **Note**
137-
> By default, AUR packages are rebuilt in dependency order. When using
138-
> `--no-sync` or non-AUR packages, targets are rebuilt in sequential order. In
139-
> this case, `arch-rebuild-order` can be used as follows:
148+
> AUR packages are rebuilt in command-line order. The rebuild order can be
149+
> retrieved with `arch-rebuild-order` as follows:
140150
>
141151
> `$ arch-rebuild-order --repos=custom <targets...>`
142152
>
143-
> If one dependency fails to build, `sync-rebuild` will try rebuilding the package
144-
> that depends on it anyway. To avoid this, use the `--fail-fast` option.
153+
> This ignores any build dependencies specified in `optdepends`; for
154+
> AUR targets, `aur depends --optdepends` may be used (although these
155+
> dependencies need manual installation.)
145156
146157
## view-delta
147158

examples/sync-rebuild

100644100755
Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ from pwd import getpwnam
1313
from decimal import Decimal
1414
#from pyalpm import vercmp
1515
from srcinfo.parse import parse_srcinfo
16-
ARGV0 = 'sync-rebuild'
16+
ARGV0 = 'rebuild'
1717

1818
def xdg_cache_home(user=None):
1919
"""Retrieve XDG_CACHE_HOME from the XDG Base Directory specification
@@ -119,7 +119,8 @@ def update_pkgrel(buildscript, pkgrel=None, increment=0.1):
119119

120120

121121
# TODO: use vercmp to ensure rebuilds, abort reverse depends when depends fails (sync--ninja)
122-
def rebuild_packages(repo_targets, db_name, start_dir, pkgver=False, fail_fast=False, user=None, *build_args):
122+
def rebuild_packages(repo_targets, db_name, start_dir, pkgver=False,
123+
fail_fast=False, user=None, *build_args):
123124
"""Rebuild a series of packages in successive order.
124125
"""
125126
build_cmd = ['aur', 'build'] + list(*build_args)
@@ -146,7 +147,7 @@ def rebuild_packages(repo_targets, db_name, start_dir, pkgver=False, fail_fast=F
146147

147148
# Run pkgver() function for VCS packages
148149
if pkgver:
149-
print(f'{ARGV0}: updating pkgver with aur-srcver', file=sys.stderr)
150+
print(f'{ARGV0}: {pkgname}: updating pkgver with aur-srcver', file=sys.stderr)
150151
for n, pkg_str in enumerate(run_readline(srcver_cmd, cwd=src_dir)):
151152
if n > 0:
152153
raise RuntimeError('ambiguous aur-srcver output')
@@ -172,13 +173,13 @@ def rebuild_packages(repo_targets, db_name, start_dir, pkgver=False, fail_fast=F
172173
new_pkgrel = update_pkgrel(buildscript, pkgrel=float(pkgrel), increment=0.1)
173174

174175
# Print bumped pkgrel to standard error
175-
print(f'{ARGV0}: {pkgname}: {pkgver}-{pkgrel} -> {pkgver}-{new_pkgrel}',
176+
print(f'{ARGV0}: {pkgbase}: {pkgver}-{pkgrel} -> {pkgver}-{new_pkgrel}',
176177
file=sys.stderr)
177178
else:
178-
print(f'{ARGV0}: source and local repository version differ', file=sys.stderr)
179-
print(f'{ARGV0}: using existing pkgver', file=sys.stderr)
179+
print(f'{ARGV0}: {pkgbase}: source and local repository version differ', file=sys.stderr)
180+
print(f'{ARGV0}: {pkgbase}: using existing pkgver', file=sys.stderr)
180181

181-
failed_rebuilds = {}
182+
failed = []
182183

183184
# Build package with modified pkgrel
184185
try:
@@ -204,21 +205,21 @@ def rebuild_packages(repo_targets, db_name, start_dir, pkgver=False, fail_fast=F
204205
except subprocess.CalledProcessError:
205206
# Build process failed, revert to unmodified PKGBUILD
206207
if buildscript_backup is not None:
207-
print(f'{ARGV0}: build failed, reverting PKGBUILD', file=sys.stderr)
208+
print(f'{ARGV0}: {pkgbase}: build failed, reverting PKGBUILD', file=sys.stderr)
208209
os.replace(buildscript_backup, buildscript)
209210

210-
# --fail-fast: if a package failed to build, also consider
211-
# remaining targets as failed
211+
# --fail-fast: if a package failed to build, consider remaining targets as failed
212212
if fail_fast:
213213
print(f'{ARGV0}: {pkgbase}: build failed, exiting', file=sys.stderr)
214+
# XXX: Preserve original order of inputs
214215
return rebuilds, list(set(repo_targets) - set(rebuilds))
215216

216217
# Mark rebuild as failure for later reporting to the user
217-
failed_rebuilds[pkgname] = pkgbase
218+
failed.append(pkgbase)
218219

219220
rebuilds[pkgname] = pkgbase
220221

221-
return rebuilds, failed_rebuilds
222+
return rebuilds, failed
222223

223224

224225
def print_cached_packages(pkgnames):
@@ -232,26 +233,26 @@ def print_cached_packages(pkgnames):
232233
p2.communicate()
233234

234235

235-
def main(targets, db_name, start_dir, pkgver, fail_fast, run_sync, chroot, user):
236+
def main(targets, db_name, start_dir, pkgver, fail_fast, run_fetch, chroot, user):
236237
# Ensure all sources are available. Only packages are cloned that are
237238
# already available in the local repository.
238-
sync_cmd = ['aur', 'sync', '--no-build', '--no-ver-argv']
239-
repo_cmd = ['aur', 'repo', '--jsonl']
239+
# XXX: Does not retrieve or handle new dependencies.
240+
fetch_cmd = ['aur', 'fetch', '--existing']
241+
repo_cmd = ['aur', 'repo', '--jsonl']
240242

241243
if user is not None:
242-
sync_cmd = ['runuser', '-u', user, '--'] + sync_cmd
243-
repo_cmd = ['runuser', '-u', user, '--'] + repo_cmd
244+
fetch_cmd = ['runuser', '-u', user, '--'] + fetch_cmd
245+
repo_cmd = ['runuser', '-u', user, '--'] + repo_cmd
244246

245247
if db_name is not None:
246-
sync_cmd.extend(('--database', db_name))
247248
repo_cmd.extend(('--database', db_name))
248249

249250
if chroot:
250251
build_args = ['--chroot']
251252
else:
252253
build_args = ['--syncdeps', '--rmdeps', '--noconfirm']
253254

254-
repo_targets = {}
255+
repo_targets_tmp = {}
255256

256257
# Read repository contents line by line to handle potentially large databases
257258
for pkg_str in run_readline(repo_cmd):
@@ -260,35 +261,40 @@ def main(targets, db_name, start_dir, pkgver, fail_fast, run_sync, chroot, user)
260261

261262
# Restrict to packages specified on the command-line
262263
if pkgname in targets:
263-
repo_targets[pkgname] = {
264-
'PackageBase': pkg['PackageBase'], 'Version' : pkg['Version']
264+
repo_targets_tmp[pkgname] = {
265+
'PackageBase': pkg['PackageBase'], 'Version': pkg['Version']
265266
}
266267

268+
# Restore order of command-line targets
269+
repo_targets = {}
270+
for target in targets:
271+
if target in repo_targets_tmp:
272+
repo_targets[target] = repo_targets_tmp[target]
273+
267274
# Clone targets that are part of the local repository
268-
# TODO: handle "new" AUR targets as usual
269275
if len(repo_targets) > 0:
270-
sync_cmd.extend(list(repo_targets.keys()))
276+
fetch_cmd.extend(list(repo_targets.keys()))
271277

272-
if run_sync:
278+
if run_fetch:
273279
repo_targets_ordered = {} # `dict` preserves order since python >=3.6
274280

275281
# Temporary file for dependency order
276-
with tempfile.NamedTemporaryFile() as sync_queue:
282+
with tempfile.NamedTemporaryFile() as fetch_results:
277283
# Read access to build user
278284
if user is not None:
279-
shutil.chown(sync_queue.name, user=user)
285+
shutil.chown(fetch_results.name, user=user)
280286

281-
# Clone AUR targets and retrieve dependency order. Dependencies
282-
# not in the local repository already will be added as targets.
283-
# XXX: requires at least one valid AUR target
284-
subprocess.run([*sync_cmd, '--save', sync_queue.name], check=True)
287+
# Clone AUR targets. Dependency order is taken from the command-line.
288+
subprocess.run([*fetch_cmd, '--results', fetch_results.name],
289+
cwd=start_dir, check=True)
285290

286-
with open(sync_queue.name, 'r') as f:
291+
# Retrieve names of cloned/fetched packages.
292+
with open(fetch_results.name, 'r') as f:
287293
for line in f.readlines():
288-
name = os.path.basename(line.rstrip())
294+
name = os.path.basename(line.split(':')[-1].rstrip())
289295
repo_targets_ordered[name] = repo_targets[name]
290296

291-
# Local repository targets not retrieved by `aur-sync` are missing from AUR
297+
# Local repository targets not retrieved by `aur-fetch` are missing from AUR
292298
# XXX: append to queue if target directories are available
293299
not_aur = list(set(repo_targets.keys()) - set(repo_targets_ordered.keys()))
294300

@@ -308,9 +314,9 @@ def main(targets, db_name, start_dir, pkgver, fail_fast, run_sync, chroot, user)
308314

309315
if len(failed) > 0:
310316
print(f'{ARGV0}: the following targets failed to build:', end=' ', file=sys.stderr)
311-
print(' '.join(failed.keys()), file=sys.stderr)
317+
print(' '.join(failed), file=sys.stderr)
312318

313-
rest = list(set(targets) - set(rebuilds.keys()) - set(failed.keys()) - set(not_aur))
319+
rest = list(set(targets) - set(rebuilds.keys()) - set(failed) - set(not_aur))
314320
else:
315321
rest = list(targets)
316322

@@ -333,7 +339,7 @@ if __name__ == '__main__':
333339
parser.add_argument('-U', '--user')
334340
parser.add_argument('--pkgver', action='store_true')
335341
parser.add_argument('--fail-fast', action='store_true')
336-
parser.add_argument('--no-sync', action='store_false')
342+
parser.add_argument('--no-fetch', action='store_false')
337343
parser.add_argument('targets', nargs='+')
338344
args = parser.parse_args()
339345

@@ -352,9 +358,9 @@ if __name__ == '__main__':
352358
# Get the path to user-specific cache files
353359
# Note: this only retrieves `AURDEST` from the current user environment.
354360
if 'AURDEST' in os.environ:
355-
aurdest = os.getenv('AURDEST')
361+
start_dir = os.getenv('AURDEST')
356362
else:
357-
aurdest = os.path.join(xdg_cache_home(args.user), 'aurutils/sync')
363+
start_dir = os.path.join(xdg_cache_home(args.user), 'aurutils/sync')
358364

359-
main({i:1 for i in args.targets}, args.database, aurdest,
360-
args.pkgver, args.fail_fast, args.no_sync, args.chroot, args.user)
365+
main({i:1 for i in args.targets}, args.database, start_dir,
366+
args.pkgver, args.fail_fast, args.no_fetch, args.chroot, args.user)

0 commit comments

Comments
 (0)