Compare commits

...

342 Commits
0.7 ... 0.14.1

Author SHA1 Message Date
d8195e2288 add media list 2019-08-10 15:29:00 +02:00
bfe9130cfb comparepkg: show group 2019-08-09 18:08:41 +02:00
8873a71824 subrepo.sh: clean up get_pkg_org() 2019-08-09 09:45:30 +02:00
bb86a05f2f support packages-devel 2019-08-08 22:42:55 +02:00
bd611c1af2 Merge branch 'artools-0.14' of artix/artools into master 2019-08-08 22:36:01 +02:00
f4e8f703ea load pkglist from /etc/artools/pkglist.d 2019-08-08 18:42:27 +02:00
aa83bc79bb rm pkglists 2019-08-08 18:15:15 +02:00
1bb9687ece add nemo packages to the cinnamon list 2019-08-01 10:44:45 -04:00
48ced03735 start 0.14 2019-07-31 21:15:22 +02:00
0437e66091 update artools.conf 2019-07-31 21:14:47 +02:00
9af6d02dea update pkglists; add more lists and make code dynamicly generate all cases 2019-07-31 19:13:07 +02:00
685992cca3 commitpkg: fix sourcing from input repo 2019-06-25 17:11:20 +02:00
816e13895f commitpkg: get proper version from repo folder instead of trunk 2019-06-24 16:59:27 +02:00
6a3f48f181 buildtree: readd switches to control arch import source 2019-06-17 19:06:59 +02:00
b4d9195c03 buildiso: don't error out if DESKTOP_LIST is not empty 2019-05-20 00:12:57 +02:00
0123e6d044 Merge branch 'serveriso' of artix/artools into master 2019-05-18 18:09:50 +02:00
e2b2a21ed1 buildiso: support extracting only rootfs with calamares 2019-05-17 23:46:52 +02:00
0e2e2875db merge sogrep functionality in comparepkg (#10) 2019-05-05 16:12:48 +02:00
a4d006adef base: fix typo in repo name 2019-04-30 00:57:46 +02:00
98926fbdd0 Merge branch 'artools-0.13' of artix/artools into master 2019-04-29 23:30:20 +02:00
a1a2289e18 sogrep: remove unused import 2019-04-29 19:01:06 +02:00
057cbf1691 prepare release 2019-04-29 14:48:25 +02:00
0b05cbeba1 deploypkg: rm links-add -n arg 2019-04-29 10:42:51 +02:00
ed5dad3066 sogrep: load artools.conf 2019-04-29 02:12:40 +02:00
76cce316a2 data: update artools.conf 2019-04-29 02:12:14 +02:00
7c152b4f60 deploypkg: add -l arg to use links db 2019-04-29 01:48:38 +02:00
79c831c616 links-add: make -n arg work 2019-04-29 01:35:48 +02:00
6b27c82b86 remove mklinksdb 2019-04-28 23:05:34 +02:00
2cc5047dda links-add: rm unused arg 2019-04-28 23:04:37 +02:00
08ab8c2137 links-add: fixes 2019-04-28 22:29:22 +02:00
9ddd962c2c add links-add & links-remove 2019-04-28 21:07:15 +02:00
a8c07bd7f3 make REPO_NAMES configurable 2019-04-28 21:06:54 +02:00
1fcf78bb47 start 0.13 2019-04-28 17:52:36 +02:00
167265944d add mklinksdb & sogrep 2019-04-28 17:46:37 +02:00
7ef931026e use proper args is_same_fs() 2019-04-28 15:24:45 +02:00
bef2a0b3fa comparepkg: only check for repos, but set pkg path 2019-04-21 01:10:01 +02:00
8d6f12f5a9 comparepkg: check for repos dir in arch git tree 2019-04-20 22:40:45 +02:00
bf6fc3fcff pkg2yaml: init fullver if empty 2019-04-04 23:12:33 +02:00
11c73f1086 pkg2yaml: add fullver map 2019-04-03 15:51:14 +02:00
62e4795000 backport devtools patches:
* makechrootpkg: keep *DEST, MAKEFLAGS & PACKAGER
* chroot-run: get all mirrors from host
2019-03-26 16:37:51 +01:00
2f92ba003b buildiso: fix display_settings() 2019-03-19 14:10:26 +01:00
c19b80adbd buildtree: get proper pkgbuild group 2019-03-13 19:31:09 +01:00
1812296bc3 util: revert server home path 2019-02-22 00:17:14 +01:00
cfb3ced261 buildiso: adopt fs group name changes
deployiso: set new server home path
2019-02-21 23:39:33 +01:00
77c7d1db8e mkchrootpkg: fix update mode 2019-02-10 16:25:22 +01:00
eb9f03c5c1 sync makepkg.conf with latest version from pacman package 2019-02-09 21:42:12 +01:00
16d0c1759d pkg2yaml: revert to func call 2019-02-06 22:13:59 +01:00
922afb4e69 pkg: fix clone msg 2019-02-06 16:49:20 +01:00
d22017e1a1 deploypkg & pkg2yaml: fix debug pkg names 2019-02-06 16:39:22 +01:00
1ea7d2ca8b readme: update deps 2019-02-03 02:31:41 +01:00
3cd8632c61 deoloypkg: add support for debug packages 2019-02-03 01:55:20 +01:00
b425eac181 buildtree: minor msg adjusting 2019-02-03 01:54:55 +01:00
4b2d516258 pkglist: update kernel 2019-02-03 01:54:29 +01:00
defd0c7ad6 buildtree: add option to only sync arch trees 2019-01-31 17:42:54 +01:00
cf0cd1772e set default artix for git & clone 2019-01-31 17:40:36 +01:00
761ccf7644 pkg: fix lxqt case in get_artix_tree() 2019-01-31 17:27:14 +01:00
5684aab444 set msg_row(9 to white for chilean green terminals :p
add lxqt list
update artools.conf
2019-01-31 17:02:19 +01:00
df8d8fb4a0 buildtree: improve msg pull & clone & import 2019-01-29 22:43:27 +01:00
be5fa4af09 buildtree: fix new non arch pkg 2019-01-28 01:56:45 +01:00
f0b84c0442 split up mainrepos (#8) 2019-01-28 00:22:42 +01:00
f0262f3cbd Merge branch 'arch-patches' of artix/artools into master 2019-01-24 17:29:25 +01:00
1905aef7d7 devtools patches 2019-01-24 13:39:17 +01:00
0a80e2b4e1 signfile: don't print key in pipeline 2019-01-16 21:44:40 +01:00
4679c59de0 data: update artools.conf 2019-01-16 21:44:03 +01:00
f308217f62 base: set new arch git url 2019-01-16 21:29:50 +01:00
0cd97b0b1d commitpkg: always push to subrepo; -u will only control maain repo push 2019-01-14 18:55:14 +01:00
a4956dba6e base: don't quote run_args 2019-01-12 02:18:10 +01:00
8738706db2 base: bind mount /run wiht os mount 2019-01-12 01:56:11 +01:00
5ca22931dd base: fix /run mount 2019-01-09 01:43:36 +01:00
652ddcd3a9 arch patches 2019-01-08 20:28:00 +01:00
7c60916356 artools-0.12 (#6) 2019-01-06 11:31:11 +01:00
b4e6dface6 buildiso: display_settings() without root; use printf for live.conf 2019-01-02 20:11:41 +01:00
fa38579488 util-iso: don't use var to set live.conf 2019-01-02 17:46:34 +01:00
07c1605666 util-yaml: only print header essential 2019-01-02 17:45:58 +01:00
bfde5dbbb1 replace old group & fix user 2019-01-02 11:48:23 +01:00
0918ff749d pkg2yaml: write valid yaml 2019-01-01 21:23:33 +01:00
3d3e4376c5 fix empty line 2019-01-01 12:58:48 +01:00
7499878d00 rename lib 2019-01-01 12:41:22 +01:00
d9e99543f6 unify yaml writer 2019-01-01 12:37:58 +01:00
43983042dd pkg2yaml: write pkgname in pkgbase 2018-12-31 14:32:08 +01:00
1b5f09076f pkg2yaml: write pkgbase name 2018-12-31 12:08:53 +01:00
d770030869 pkg2yaml: fix ident for pkgbase info 2018-12-31 11:24:25 +01:00
ea06ec0b2e util-pkg-subrepo: check master by default 2018-12-30 11:56:05 +01:00
e67990ae04 commitpkg: make check for pull work 2018-12-30 11:50:33 +01:00
b37d5f0236 buildtree & commitpkg: use same pull func 2018-12-30 03:45:17 +01:00
989af04593 pkg2yaml: include deps 2018-12-30 03:44:29 +01:00
90f46d7ecc buildtree: ensure trunk exists for newly cloned subrepos 2018-12-29 13:22:35 +01:00
8e872ca9ca buildtree: fix new repo sync & help 2018-12-28 17:08:08 +01:00
05c95b7025 comparepkg: fix help
buildtree: rm unstable flag
2018-12-21 18:29:11 +01:00
442aee08df fix move display 2018-12-21 12:27:50 +01:00
2c497f663b buildtree: split out compare 2018-12-21 01:11:25 +01:00
9a84cdedd5 util-pkg-subrepo: write updated jenkinsfile 2018-12-18 06:30:38 +01:00
bcc807ebbc buildpkg: fix opts 2018-12-17 02:54:07 +01:00
6b00319bfc buildpkg, deploypkg: restore global path vars 2018-12-17 02:50:08 +01:00
c24f625d81 Makefile: add gnome & kde unstable pacman.conf 2018-12-16 20:43:49 +01:00
15ca2bfc7e util-pkg: move get_pkg_org() 2018-12-16 20:43:22 +01:00
2487f4655e builtree: show repo moved updates 2018-12-16 12:24:32 +01:00
c2fd4636a3 version 0.11 (#5) 2018-12-16 01:34:30 +01:00
a82b704c2b pkg2yaml: use file names 2018-12-14 23:11:31 +01:00
1aa6a644b0 util-pkg: readd lost func 2018-12-14 23:11:06 +01:00
ff3ea53482 Nakefile: fix pkg2yaml path 2018-12-14 18:48:26 +01:00
d0e3c4e421 add pkg2yaml; some cosmetics in buildiso & buildrtree 2018-12-14 18:45:55 +01:00
1659689e71 buildtree: mkrepo for non arch packages (#4) 2018-12-12 16:05:00 +01:00
81ebb6c399 buildtree: fix import new pkg 2018-12-11 11:45:35 +01:00
ea66cb27fc migration of buildtree & commitpkg (#3) 2018-12-10 21:57:27 +01:00
3e7c4e371c deployiso: remove old Sf code 2018-11-18 17:54:10 +01:00
8dbd07ff55 deployiso: fix typo file_host, fix home path 2018-11-18 03:14:27 +01:00
d88ede3984 deployiso: switch to artix host
commitpkg: only --clean on subrepo push
2018-11-18 03:00:28 +01:00
04a1da9dd9 util-pkg-subrepo: use --clean in pull and push 2018-11-15 12:16:00 +01:00
7eb70fcf2b util-pkg: rm repo_map 2018-11-07 18:55:55 +01:00
16207221dc deployiso: remove obsolete vars 2018-11-07 18:12:47 +01:00
daf58430a9 buildtree: use renamed func 2018-11-07 18:12:19 +01:00
8b32e346f6 util-pkg: rename func, small optimizations 2018-11-07 18:11:40 +01:00
8df5a87738 util: rm obsolete vars 2018-11-07 18:10:41 +01:00
e2dbe82949 upd artools.conf 2018-11-07 18:09:49 +01:00
38075ad5ad buildiso: iso_label doesn't need a shared scope 2018-10-22 19:41:04 +02:00
a99a9c9699 capitals for input param 2018-10-22 12:18:14 +02:00
2cd876ade4 artools.conf: set default uplimit 1000 2018-10-22 12:16:57 +02:00
4eea0db73d buildiso: fix user & host name 2018-10-22 01:52:45 +02:00
6f18d339df var adjustments & fixes 2018-10-21 23:50:21 +02:00
d31ca02c2a * start 0.10
* capitalize global vars
2018-10-21 17:31:17 +02:00
8a0cd5c236 util-iso*: remove old code 2018-10-21 14:35:40 +02:00
e300104dcf util-pkg: improve find_repo()
Makefile: clean up
2018-10-21 14:35:06 +02:00
a13f0079db more clean up 2018-10-12 17:34:53 +02:00
cae48c0878 util-iso-profile: use @ operator to tag init specific pkgs 2018-10-09 16:53:52 +02:00
ce481f6b07 clean up 2018-10-08 19:36:28 +02:00
b6a4619ab3 mkchroot: add switch for mirrorlist copying 2018-10-08 17:09:19 +02:00
88ebc5c476 rm unused code 2018-10-08 16:49:43 +02:00
c27c516610 update artools.conf 2018-10-07 22:53:05 +02:00
42ee8522dd deployiso: remove torrent support; will become a standalone wrapper eventually 2018-10-07 22:51:48 +02:00
b7f05f4dd2 util-iso: always include initsys in iso filename & if gremlins/goblins 2018-10-06 22:59:34 +02:00
f58e8b6c15 util-iso-yaml: add optional libpwquality check in user module 2018-10-03 11:11:02 +02:00
d432ffee3f util-iso-yaml: remoive netinstall commented code
util-iso: check for $log_dir
2018-10-03 10:22:31 +02:00
961bc2cd59 Explicitly create log_dir and iso_root (#2) 2018-10-03 04:18:54 +02:00
92aeff61d8 util-iso-grub: enable ucode
util-iso-yaml: rm netinstall
util-pkg-subrepo: simplify
2018-10-02 22:31:57 +02:00
64725482f8 update readme 2018-09-07 22:27:08 +02:00
11cd590529 util-iso-yaml: fix services in settings.conf 2018-09-07 22:19:26 +02:00
bb22741aa1 util-iso-grub: set pxe in base profile only 2018-09-07 17:34:52 +02:00
28e4b73964 util-iso-yaml: add dir options in services-openrc; fix runit svc typos 2018-09-06 19:29:57 +02:00
7ea0d6f475 util-iso-yaml: adopt upstream cal new services naming 2018-09-06 18:06:20 +02:00
bdcc22fd46 Makefile: remove uninstall & dist 2018-09-06 18:05:29 +02:00
3c2e97f915 buildtree: fix config arg on pull 2018-08-12 02:58:32 +02:00
ba77c20d77 buildtree: ch in proper dir in config 2018-08-12 02:48:47 +02:00
c376041a07 buildtree: fix it 2018-08-12 02:38:24 +02:00
bd29d360b4 buildtree: fix path 2018-08-12 02:34:47 +02:00
7e1b1ee238 nuildtree: configure repo after clone as well, its too later after pull only 2018-08-12 02:21:24 +02:00
221218ba2a util-pkg: don't set localersion in kernel config 2018-08-09 01:54:48 +02:00
697d18da82 util-pkg-gitea: create compliant git repo 2018-08-07 21:47:34 +02:00
27d0230ed7 buildtree: fix import 2018-08-07 02:38:25 +02:00
41fdcb68fb commitpkg: run git prune 2018-08-06 22:17:01 +02:00
37b02c08bc util-pkg-gitea: add licence header 2018-07-30 02:43:29 +02:00
31200d7765 util-pkg-gitea: get compliant repo name 2018-07-30 02:21:53 +02:00
60844ee0ea Merge branch 'subrepo' of artix/artools into master 2018-07-29 20:47:25 +00:00
2c2e6b41a1 commitpkg: move subrepo push in push switch 2018-07-29 18:45:40 +02:00
52c81a0e61 bump version 2018-07-29 18:38:10 +02:00
6667147b77 buildtree: fix import 2018-07-29 17:25:48 +02:00
26635e3a10 use ssh for git 2018-07-29 00:28:43 +02:00
1d5a565ed8 commitpkg: spilt out subrepo functions 2018-07-28 22:29:15 +02:00
4e54b48903 commitpkg: fix, add sleep 1 2018-07-28 22:23:10 +02:00
2f16cd73c9 buildtree, commitpkg: prepare first test 2018-07-28 21:54:26 +02:00
9fd6ac3531 buildtree: revert to old pkg repos 2018-07-27 20:39:26 +02:00
2f5acc6e3c buildtree, commitpkg: adapt import path 2018-07-27 19:51:27 +02:00
d73b6d9178 rename gitea lib 2018-07-27 19:47:30 +02:00
d5404ac2fa builtree: write jenkinsfile for new pkgs 2018-07-27 18:28:34 +02:00
d250b967ba buildtree, commitpkg: use subrepo 2018-07-27 14:52:30 +02:00
5715eecf0c buildtree, commitpkg: initial gitea/subrepo support 2018-07-27 13:35:31 +02:00
b6ef4d1895 buildtree: add -y arg to exclude staging from compare ops 2018-07-02 01:56:55 +02:00
3fd33eca4a mkchrootpkg: rm workarounds in chroot 2018-06-30 00:37:51 +02:00
eceed82a61 Remove cow file early for non-persistent systems 2018-06-29 21:42:12 +02:00
7337c341ba buildtree: configure git repo with makepkg's GPGKEY 2018-06-29 20:08:02 +02:00
51658f4838 buildtree: make signing commits mandatory 2018-06-29 16:50:19 +02:00
9dcef56350 chroot-run: bind mount /etc/hosts again 2018-06-27 22:51:59 +02:00
ba2647b4b0 rm pcmcia from initcpio 2018-06-27 22:51:15 +02:00
e10571eac0 util-iso-grub: create unicode fontinstead of copying 2018-06-21 23:52:31 +02:00
045ed9e895 Merge branch 'master' of github.com:artix-linux/artools into devel 2018-06-19 21:34:46 +02:00
60e77a878c readd locale backup 2018-06-19 21:34:23 +02:00
69d3897abb makefile: bump chroot version 2018-06-19 20:35:37 +02:00
90060a3851 mkchroot: fix dbus-uuidgen call 2018-06-19 20:12:32 +02:00
1bc756ec15 rm old code 2018-06-19 14:47:58 +02:00
26daf3aaa0 basestrap: improve resolv.conf mounting 2018-06-19 13:10:01 +02:00
c772bf8ea1 simplify chroot traps & mounting 2018-06-19 10:15:29 +02:00
caccd55fc1 util-chroot: fix locale 2018-06-19 09:47:44 +02:00
a2b31b72a0 fstabgen: add support for prefix matching 2018-06-18 21:54:41 +02:00
1beb5131ce disable crypto_speck module on linux import 2018-06-13 14:47:28 +02:00
udeved
ef794a0b85 mkchrootpkg: whitelist return code 14 from makepkg 2018-05-31 18:07:31 +02:00
udeved
aa12fc42bd buildtree: quote version vars 2018-05-29 17:29:07 +02:00
udeved
50f90ab53c mkchrootpkg: arch patches 2018-05-29 13:30:32 +02:00
udeved
63137eb046 util-iso-yaml: fix settings.conf path 2018-05-28 13:06:59 +02:00
udeved
92ec5eb194 util-iso-yaml: adopt runitcfg changes 2018-05-28 10:10:12 +02:00
udeved
f8e07c66c1 util-iso-grub: rm i686 support 2018-05-28 09:23:16 +02:00
udeved
2130eea235 initcpio: rm i686 from kms 2018-05-28 09:22:54 +02:00
udeved
58fc4bbe45 buildiso: remove kernel opt 2018-05-28 09:01:32 +02:00
udeved
591ae02d55 mkchrootpkg: update for pacman-5.1 2018-05-28 09:00:49 +02:00
udeved
6311233f73 util-iso-yaml: adopt calamares modules changes 2018-05-27 22:47:36 +02:00
udeved
398e91bdd9 deploypkg: add repo action check 2018-05-12 23:13:26 +00:00
udeved
d1f4c03e05 mkchrootpkg: add /etc/shadow entry for builduser for sudo 1.8.23 2018-05-12 09:28:57 +00:00
udeved
180decbc5e gitignore: update 2018-04-28 20:20:08 +02:00
udeved
943c0c36ea util-iso-profile: support base in git repo if present 2018-04-28 20:19:50 +02:00
udeved
60116e9f93 update pacman.conf files 2018-04-28 02:16:19 +02:00
udeved
eea5d31427 uril-iso-profile: split the path setters in init_profile() 2018-04-27 11:10:15 +02:00
udeved
d05e8700ef util-profile: update defaults 2018-04-26 22:59:44 +02:00
udeved
1d310e18e9 buildtree: add braodcom-wl to patch_pkg() 2018-04-26 22:41:32 +02:00
udeved
baf290d3aa Makefile: rm base profile 2018-04-26 19:37:37 +02:00
udeved
1f379eec51 Merge branch 'devel' of github.com:artix-linux/artools 2018-04-26 19:32:55 +02:00
udeved
c4d1425c46 move base profile in iso-profiles 2018-04-26 19:30:59 +02:00
udeved
e5211838e8 Merge branch 'devel' of github.com:artix-linux/artools 2018-04-17 21:28:02 +02:00
udeved
441c97730b util-iso: append if runit to iso filename 2018-04-15 03:08:47 +02:00
udeved
8ca984325a util-iso-profiles: make setting DM easy to expand 2018-04-15 02:57:17 +02:00
artoo
3c4fc6e00b Merge pull request #42 from konimex/devel
Add initial runit support
2018-04-15 00:05:10 +02:00
udeved
20a20ee8bb buildiso: set the DM on runit 2018-04-14 22:44:30 +02:00
2aae876d98 Detect the service directory using the correct check.
I was an idiot..
2018-04-14 21:16:24 +07:00
a19379596d Add initial runit support 2018-04-14 21:15:49 +07:00
udeved
af8ab5fd1e buildiso: runit support for servicescfg 2018-04-14 10:37:10 +02:00
artoo
1c56ce7f8c Merge pull request #63 from artix-linux/devel
Devel
2018-04-11 17:14:38 +02:00
udeved
f80c5bf587 Makefile: clean up iso install & uninstall 2018-04-11 17:11:35 +02:00
udeved
d5c8af7025 initcpio: fix uninstall 2018-04-11 12:31:05 +02:00
udeved
12a41ec0b2 Makefile: fix sub makes 2018-04-11 12:23:52 +02:00
udeved
b5eb287867 Makefile: use CPIODIR 2018-04-11 12:18:12 +02:00
udeved
3e4fbd892e readme: fix typo 2018-04-11 11:56:11 +02:00
udeved
dca96f29d7 readme: update 2018-04-11 11:49:24 +02:00
udeved
a382bdc83a Makefile: split initcpio 2018-04-11 11:26:54 +02:00
udeved
b73aec6031 initcpio: add makefile 2018-04-11 11:26:35 +02:00
udeved
88f1145c96 Makefile: split base profile in sep. Makefile 2018-04-11 11:03:36 +02:00
udeved
43bc1d149a Makefile: add default mode 2018-04-10 15:30:14 +02:00
udeved
ffa532591c Makefile: cleanup uninstall 2018-04-10 15:22:11 +02:00
udeved
f9f8ca6b68 Makefile: define overlaydir 2018-04-10 14:25:55 +02:00
udeved
dbc3a94906 Makefile: add condition flags 2018-04-10 11:55:19 +02:00
udeved
8e4b5f88ca start 0.8 2018-04-10 00:32:26 +02:00
udeved
104cc0b1ef data: fix base profile fstab 2018-04-10 00:29:07 +02:00
udeved
ce790fcaab Makefile: fix uninstall 2018-04-10 00:28:11 +02:00
udeved
2d03e16a5f buildiso: add goblins repo support 2018-04-08 14:17:41 +02:00
udeved
64e0badbac Makefile: add buildiso-goblins symlink 2018-04-08 14:13:14 +02:00
udeved
a94afab8a0 readme: update 2018-04-07 16:30:01 +02:00
artoo
1d3c77dc73 Merge pull request #62 from artix-linux/devel
deploypkg: simplify code in update_repo()
2018-04-07 12:03:33 +02:00
udeved
1cccece399 deploypkg: simplify code in update_repo() 2018-04-06 23:05:15 +02:00
artoo
cc8b47912e Merge pull request #61 from artix-linux/devel
Devel
2018-04-06 22:19:26 +02:00
udeved
f36cf35d9a deploypkg: enable checkpkg on add 2018-04-06 22:17:46 +02:00
udeved
cca5283db6 deploypkg: optimize pacman db access 2018-04-06 22:04:39 +02:00
udeved
d6bf8bcf12 util-pkg: check for PKGBUILD instead of checking for repo dir in find_repo() 2018-04-06 21:04:49 +02:00
udeved
88886de9e9 remove vbox from base Packages-Live 2018-03-31 11:19:53 +02:00
artoo
55b0cd4ae2 Merge pull request #59 from artix-linux/devel
Devel
2018-03-30 23:39:01 +02:00
udeved
84a51f4a9e buildtree: code cleanup 2018-03-30 23:27:55 +02:00
udeved
87ad3a631a buildtree: add option to import from trunk, defaults to repos/$repo 2018-03-30 16:15:50 +02:00
udeved
2a70b5f123 commitpkg: quote some vars 2018-03-30 16:15:18 +02:00
udeved
3106e8975f commitpkg: make move more safe; prevent unwanted subdir in $repo in few cases 2018-03-30 02:18:25 +02:00
udeved
4a02e2d7be buildtree: init unstable false
unstable repos are only included on -x
2018-03-28 21:15:12 +02:00
udeved
4363421ce8 mkchrootpkg: revert fix verifysource with pacman-git until new pacman version 2018-03-27 20:38:38 +02:00
udeved
4b96a54347 buildtree: add -x to disable arch unstale kde and gnome when comparing 2018-03-27 20:12:59 +02:00
udeved
0ad953ead8 mkchrootpkg: port arch patch 2018-03-27 19:05:42 +02:00
udeved
45ebe43272 buildtree: fix upate display by sourcing the repo build instead of trunk 2018-03-27 19:04:58 +02:00
udeved
1c64fe7f69 commitpkg: make move more safe 2018-03-22 11:16:02 +01:00
udeved
c2a030b016 mkpkgclean: fix pretend 2018-03-18 16:44:25 +01:00
udeved
94670e18e7 add mkpkgclean 2018-03-18 16:20:00 +01:00
udeved
5c835b6e2c deploypkg: navigate in the repo dir in order to make old package removal work on repo-add 2018-03-18 15:47:53 +01:00
udeved
3f803be6b8 buildtree: clean view 2018-03-17 01:23:54 +01:00
udeved
70b81d7ff8 buildtree: view arch 2018-03-16 19:04:41 +01:00
udeved
12a34bd5a2 buildtree: add option to view depends of a given pkg 2018-03-16 18:53:59 +01:00
udeved
11504d3267 buildtree: fix checkdepends msg 2018-03-15 17:16:55 +01:00
udeved
203df20e76 commitpkg: prevent trunk dir copy in certain cases 2018-03-14 09:32:57 +01:00
udeved
184259c600 Merge branch 'devel' of github.com:artix-linux/artools 2018-03-12 21:50:29 +01:00
udeved
b95c7dee0d mkchrootpkg: reenable ctty workaround 2018-03-12 21:49:20 +01:00
udeved
c7c67fbc21 buildtree: show arch kde and gnome unstable 2018-03-12 21:47:34 +01:00
artoo
21a5c7e916 Merge pull request #57 from artix-linux/devel
Devel
2018-03-05 17:15:21 +01:00
udeved
62810d1d85 rm lists, pipelines 2018-03-05 17:09:19 +01:00
udeved
865bd20674 buildtree: add -z switch to skip arch sync 2018-03-04 23:13:41 +01:00
artoo
b46b5c626e Merge pull request #54 from artix-linux/devel
Devel
2018-02-21 01:11:10 +01:00
udeved
9ac4576666 upd missing pkgs list 2018-02-21 01:07:17 +01:00
udeved
a88f196217 commitpkh: clean up 2018-02-21 01:06:48 +01:00
udeved
c0e8ef4c26 buildiso: default to linux kernel 2018-02-19 23:59:39 +01:00
artoo
02b28e82ef Merge pull request #53 from artix-linux/devel
upd missing build deps
2018-02-17 21:58:53 +01:00
udeved
fb6d1d4c1b upd missing build deps 2018-02-17 21:58:09 +01:00
artoo
9fc3fbd14d Merge pull request #52 from artix-linux/devel
Devel
2018-02-17 21:57:15 +01:00
udeved
72f2781cb9 buildtree: fix new imports that don't exist 2018-02-17 21:54:59 +01:00
udeved
9ddd73c8b4 buildtree: use find_tree() to determine the git repo 2018-02-17 12:59:17 +01:00
udeved
3c92d5c87a mkchrootpkg: place comments for workarounds 2018-02-17 12:58:31 +01:00
artoo
bc8f17cc86 Merge pull request #51 from artix-linux/devel
commitpkg: revert to pull before push if rebase default
2018-02-17 03:18:58 +01:00
udeved
1ceb6926e9 commitpkg: revert to pull before push if rebase default 2018-02-17 03:17:46 +01:00
artoo
4d3a993a72 Merge pull request #50 from artix-linux/devel
Devel
2018-02-17 02:56:20 +01:00
udeved
a52bdc9799 commitpkg: fix git_tree display 2018-02-17 02:38:27 +01:00
udeved
b62e90f778 mkchroot & chroot-run: set chroot version with makefile 2018-02-17 02:19:51 +01:00
udeved
5d2fda793d mkchroot: set static chroot version 2018-02-17 02:08:15 +01:00
udeved
550663cfd1 commitpkg, buildtree: clean up code 2018-02-17 02:05:13 +01:00
artoo
6c117fb97d Merge pull request #49 from artix-linux/devel
Devel
2018-02-17 00:23:00 +01:00
udeved
7e6d832314 commitpkg: improve git_tree handling; add error handling 2018-02-17 00:16:34 +01:00
udeved
6fc7b124fc update missing pkgs list 2018-02-16 20:56:59 +01:00
udeved
a011005901 deploypkg: check per pkg & sig 2018-02-16 20:56:41 +01:00
udeved
5da4fea263 chroot-run: bind mount /etc/hosts 2018-02-16 20:19:30 +01:00
udeved
e1b8a0493b commitpkg: add a check to pull if changes before push 2018-02-15 23:22:22 +01:00
udeved
8fe1e82226 util-msg: fix msg_row 2018-02-15 22:43:25 +01:00
udeved
aa8725518b commitpkg: fix it 2018-02-15 22:39:28 +01:00
artoo
fc5a446784 Merge pull request #46 from artix-linux/devel
Devel
2018-02-15 21:54:21 +01:00
udeved
64ce7c3bd6 commitpkg: restore 2018-02-15 21:13:46 +01:00
udeved
8e3a7d98f9 commitpkg: fix 2018-02-15 21:02:02 +01:00
udeved
c4e47b6513 upd missing pkgs list 2018-02-15 20:48:35 +01:00
udeved
b17e93d37f commitpkg: fix moving 2018-02-15 20:48:35 +01:00
udeved
f2e575a37c upd missing pkgs list 2018-02-15 20:47:44 +01:00
udeved
706fa58ddd commitpkg: fix moving 2018-02-15 20:47:17 +01:00
udeved
de4652ac94 merge branch 'devel' into artix-linux/master 2018-02-15 13:21:03 +01:00
udeved
cd37fde7ca fixes 2018-02-15 12:59:18 +01:00
udeved
0f3b352020 rm blacklist 2018-02-15 12:58:53 +01:00
udeved
c60dabdf6b buildtree: remove import lists 2018-02-13 22:33:12 +01:00
udeved
208b751142 buildtree: filter away artix packages on -d 2018-02-13 21:45:43 +01:00
udeved
bfc8b8ce80 mkchrootpkg: use en locale 2018-02-13 21:11:47 +01:00
udeved
6cfbc8b97e update imports 2018-02-13 20:32:16 +01:00
udeved
4f454f4ec4 buildtree: enable importing new packages in trunk
commitpkg: cosmetics in display_settings()
2018-02-13 20:31:57 +01:00
udeved
478e8fbba3 update imports 2018-02-13 19:51:49 +01:00
udeved
fc41bd7be4 commitpkg: fix remove option 2018-02-13 19:51:25 +01:00
udeved
b9eeec876b commitpkg: add a remove switch for commitpkg mode 2018-02-13 16:38:25 +01:00
udeved
ce6d6d093e buildtree: use patch_pkg() 2018-02-13 16:37:42 +01:00
udeved
996deb8924 buildtree: add downgrades switch 2018-02-13 00:09:35 +01:00
udeved
63af5c762f mkchrootpkg: clean up _chrootbuild 2018-02-12 20:39:11 +01:00
udeved
9eef1c3a05 buildtree: simplify show_artix_repo() 2018-02-12 13:38:06 +01:00
udeved
95858019e9 update imports 2018-02-12 11:57:21 +01:00
udeved
e1a9f2a1b3 buildtree, commitpkg: fixes 2018-02-12 11:53:49 +01:00
udeved
238302d3ce nkchrootpkg: use env in chroot to set env vars 2018-02-12 11:53:16 +01:00
udeved
73d7fd28af buildtree: show artix repo in compare 2018-02-11 22:34:19 +01:00
udeved
4d834ddaaa buildtree, commitpkg: small fixes 2018-02-11 19:40:56 +01:00
udeved
027e29e025 jenkinsfiles update 2018-02-11 19:40:28 +01:00
udeved
5fbf1f7d43 buildtree: write patches in patchdir 2018-02-11 17:38:50 +01:00
udeved
88b0206121 Merge branch 'devel' of github.com:artix-linux/artools into devel 2018-02-11 17:37:23 +01:00
udeved
d71af677f5 buildtree: add git tree vars 2018-02-11 12:54:32 +01:00
udeved
63ef4ee33b buildtree: add single package import
commitpkg: clean up
2018-02-11 11:23:47 +01:00
udeved
0b2e104504 buildtree: import and compare all artix git repos 2018-02-11 01:14:17 +01:00
udeved
3a7881d5c5 import linux and linux-lts 2018-02-11 00:39:28 +01:00
udeved
74dd869dc2 update jenkinsfile 2018-02-11 00:37:48 +01:00
udeved
718d4062b0 commitpkg: fix trunk release 2018-02-10 23:29:32 +01:00
udeved
66e9fa4caa update example jenkinsfile 2018-02-10 23:28:55 +01:00
udeved
f728680c28 update example pipelines 2018-02-10 21:07:23 +01:00
udeved
3a0746a358 commitpkg: simplify usage 2018-02-10 21:06:58 +01:00
udeved
5da701a318 update example jenkinsfile 2018-02-10 16:14:56 +01:00
udeved
45b1a95332 jenkinsfiles fixes 2018-02-10 12:36:05 +01:00
udeved
450b51ea71 buildtree: patch linux package 2018-02-10 10:53:39 +01:00
udeved
aa71c050b2 commitpkg: add a commit option for imported pkgs 2018-02-10 02:25:57 +01:00
udeved
e4966f2351 jenkinsfile: use signing on build success 2018-02-10 02:25:57 +01:00
udeved
894054d3cd deploypkg: add sign switch 2018-02-10 02:25:57 +01:00
udeved
969ce59e3d commitpkg: fix to_new() 2018-02-10 02:25:57 +01:00
udeved
94ec82f2d5 commitpkg: init pretend switch 2018-02-10 02:25:57 +01:00
udeved
58a043a35c Makefile: rm old sym 2018-02-10 02:25:57 +01:00
udeved
0cfdb6b8df start 0.7 2018-02-10 02:25:57 +01:00
udeved
bc5f417a90 artools-0.7 rm old 2018-02-10 02:25:57 +01:00
udeved
be3720cd56 Merge branch 'devel' of github.com:artix-linux/artools into devel 2018-01-30 12:37:54 +01:00
udeved
0cd6b45f04 Merge branch 'master' of github.com:artix-linux/artools into devel 2018-01-27 13:52:29 +01:00
83 changed files with 4473 additions and 4686 deletions

2
.gitignore vendored
View File

@@ -4,3 +4,5 @@
.kateproject.d
data/schemas/*.conf
.project
iso-profiles
live-services

315
Makefile
View File

@@ -1,53 +1,46 @@
Version=0.7
VERSION=0.14
PREFIX = /usr/local
CHROOT_VERSION=0.9
TOOLS = artools
PREFIX ?= /usr
SYSCONFDIR = /etc
BINDIR = $(PREFIX)/bin
LIBDIR = $(PREFIX)/lib
DATADIR = $(PREFIX)/share
CPIODIR = $(SYSCONFDIR)/initcpio
SYSCONF = \
CONF = \
data/artools.conf
BIN_BASE = \
bin/mkchroot \
bin/basestrap \
bin/artools-chroot \
bin/fstabgen \
bin/signfile \
bin/chroot-run
BASE_BIN = \
bin/base/signfile \
bin/base/chroot-run \
bin/base/mkchroot \
bin/base/basestrap \
bin/base/artools-chroot \
bin/base/fstabgen
LIBS_BASE = \
lib/util.sh \
lib/util-msg.sh \
lib/util-mount.sh \
lib/util-chroot.sh \
lib/util-fstab.sh
BASE_LIBS = \
$(wildcard lib/base/*.sh)
SHARED_BASE = \
$(wildcard data/pacman*.conf)
BASE_UTIL = lib/util-base.sh
LIST_IMPORT = \
$(wildcard data/import.list.d/*.list)
BASE_DATA = \
$(wildcard data/base/pacman*.conf)
BIN_PKG = \
bin/checkpkg \
bin/lddd \
bin/finddeps \
bin/find-libdeps \
bin/mkchrootpkg \
bin/buildpkg \
bin/buildtree \
bin/deploypkg \
bin/commitpkg
PKG_BIN = \
bin/pkg/buildpkg \
bin/pkg/deploypkg \
bin/pkg/commitpkg \
bin/pkg/comparepkg \
bin/pkg/mkchrootpkg \
bin/pkg/pkg2yaml \
bin/pkg/buildtree \
bin/pkg/lddd \
bin/pkg/links-add
LIBS_PKG = \
$(wildcard lib/util-pkg*.sh)
SHARED_PKG = \
data/makepkg.conf
PATCHES = \
$(wildcard data/patches/*.patch)
COMMITPKG_SYMS = \
LN_COMMITPKG = \
extrapkg \
corepkg \
testingpkg \
@@ -57,168 +50,152 @@ COMMITPKG_SYMS = \
community-stagingpkg \
multilibpkg \
multilib-testingpkg \
multilib-stagingpkg
BIN_ISO = \
bin/buildiso \
bin/deployiso
multilib-stagingpkg \
kde-unstablepkg \
gnome-unstablepkg
LIBS_ISO = \
$(wildcard lib/util-iso*.sh)
LN_BUILDPKG = \
buildpkg-system \
buildpkg-world \
buildpkg-gremlins \
buildpkg-goblins \
buildpkg-galaxy \
buildpkg-galaxy-gremlins \
buildpkg-galaxy-goblins \
buildpkg-lib32 \
buildpkg-lib32-gremlins \
buildpkg-lib32-goblins \
buildpkg-kde-wobble \
buildpkg-gnome-wobble
SHARED_ISO = \
data/mkinitcpio.conf
LN_DEPLOYPKG = \
deploypkg-system \
deploypkg-world \
deploypkg-gremlins \
deploypkg-goblins \
deploypkg-galaxy \
deploypkg-galaxy-gremlins \
deploypkg-galaxy-goblins \
deploypkg-lib32 \
deploypkg-lib32-gremlins \
deploypkg-lib32-goblins \
deploypkg-kde-wobble \
deploypkg-gnome-wobble
CPIOHOOKS = \
$(wildcard initcpio/hooks/*)
PKG_LIBS = \
$(wildcard lib/pkg/*)
CPIOINST = \
$(wildcard initcpio/install/*)
PKG_UTIL = lib/util-pkg.sh
CPIO = \
initcpio/script/artix_shutdown
PKG_DATA = \
data/pkg/makepkg.conf
BASE = \
$(wildcard data/base/Packages-*) \
data/base/profile.conf
PATCHES = \
$(wildcard data/patches/*.patch)
LIVE_ETC = \
data/base/live-overlay/etc/issue \
data/base/live-overlay/etc/fstab
ISO_BIN = \
bin/iso/buildiso \
bin/iso/deployiso
LIVE_ETC_DEFAULT = \
$(wildcard data/base/live-overlay/etc/default/*)
LN_BUILDISO = \
buildiso-gremlins \
buildiso-goblins
LIVE_ETC_PAM = \
$(wildcard data/base/live-overlay/etc/pam.d/*)
ISO_LIBS = \
$(wildcard lib/iso/*.sh)
LIVE_ETC_SUDOERS = \
$(wildcard data/base/live-overlay/etc/sudoers.d/*)
ISO_UTIL = lib/util-iso.sh
all: $(BIN_BASE) $(BIN_PKG) $(BIN_ISO)
ISO_DATA = \
data/iso/mkinitcpio.conf
edit = sed -e "s|@datadir[@]|$(DESTDIR)$(PREFIX)/share/artools|g" \
-e "s|@sysconfdir[@]|$(DESTDIR)$(SYSCONFDIR)/artools|g" \
-e "s|@libdir[@]|$(DESTDIR)$(PREFIX)/lib/artools|g" \
-e "s|@version@|${Version}|"
DIRMODE = -dm0755
FILEMODE = -m0644
MODE = -m0755
LN = ln -sf
RM = rm -f
M4 = m4 -P
CHMODAW = chmod a-w
CHMODX = chmod +x
%: %.in Makefile
BIN = $(BASE_BIN) $(PKG_BIN) $(ISO_BIN)
UTIL = $(BASE_UTIL) $(PKG_UTIL) $(ISO_UTIL)
all: $(BIN) $(UTIL)
EDIT_UTIL = sed -e "s|@datadir[@]|$(DATADIR)|g" \
-e "s|@sysconfdir[@]|$(SYSCONFDIR)|g" \
-e "s|@libdir[@]|$(LIBDIR)|g" \
-e "s|@chroot_version@|$(CHROOT_VERSION)|"
EDIT_BIN = sed -e "s|@libdir[@]|$(LIBDIR)|g"
$(UTIL): %: %.in Makefile
@echo "GEN $@"
@$(RM) "$@"
@m4 -P $@.in | $(edit) >$@
@chmod a-w "$@"
@chmod +x "$@"
@$(M4) $@.in | $(EDIT_UTIL) >$@
@$(CHMODAW) "$@"
$(BIN): %: %.in Makefile
@echo "GEN $@"
@$(RM) "$@"
@$(M4) $@.in | $(EDIT_BIN) >$@
@$(CHMODAW) "$@"
@$(CHMODX) "$@"
clean:
rm -f $(BIN_BASE) ${BIN_PKG} ${BIN_ISO}
$(RM) $(BIN) $(UTIL)
install_base:
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/artools
install -m0644 ${SYSCONF} $(DESTDIR)$(SYSCONFDIR)/artools
install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
install $(FILEMODE) $(CONF) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
install -dm0755 $(DESTDIR)$(PREFIX)/bin
install -m0755 ${BIN_BASE} $(DESTDIR)$(PREFIX)/bin
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(BASE_BIN) $(DESTDIR)$(BINDIR)
install -dm0755 $(DESTDIR)$(PREFIX)/lib/artools
install -m0644 ${LIBS_BASE} $(DESTDIR)$(PREFIX)/lib/artools
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install $(FILEMODE) $(BASE_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(BASE_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools
install -m0644 ${SHARED_BASE} $(DESTDIR)$(PREFIX)/share/artools
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(BASE_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install_pkg:
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/artools/import.list.d
install -m0644 ${LIST_IMPORT} $(DESTDIR)$(SYSCONFDIR)/artools/import.list.d
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(PKG_BIN) $(DESTDIR)$(BINDIR)
install -dm0755 $(DESTDIR)$(PREFIX)/bin
install -m0755 ${BIN_PKG} $(DESTDIR)$(PREFIX)/bin
ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
for l in ${COMMITPKG_SYMS}; do ln -sf commitpkg $(DESTDIR)$(PREFIX)/bin/$$l; done
install -dm0755 $(DESTDIR)$(PREFIX)/lib/artools
install -m0644 ${LIBS_PKG} $(DESTDIR)$(PREFIX)/lib/artools
$(LN) links-add $(DESTDIR)$(BINDIR)/links-remove
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools
install -m0644 ${SHARED_PKG} $(DESTDIR)$(PREFIX)/share/artools
for l in $(LN_COMMITPKG); do $(LN) commitpkg $(DESTDIR)$(BINDIR)/$$l; done
for l in $(LN_BUILDPKG); do $(LN) buildpkg $(DESTDIR)$(BINDIR)/$$l; done
for l in $(LN_DEPLOYPKG); do $(LN) deploypkg $(DESTDIR)$(BINDIR)/$$l; done
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/patches
install -m0644 ${PATCHES} $(DESTDIR)$(PREFIX)/share/artools/patches
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
install $(FILEMODE) $(PKG_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(PKG_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
install_isobase:
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base
install -m0644 ${BASE} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(PKG_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc
install -m0644 ${LIVE_ETC} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
install $(FILEMODE) $(PATCHES) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/default
install -m0644 ${LIVE_ETC_DEFAULT} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/default
install_cpio:
+make CPIODIR=$(CPIODIR) DESTDIR=$(DESTDIR) -C initcpio install
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/pam.d
install -m0644 ${LIVE_ETC_PAM} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/pam.d
install_iso: install_cpio
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(ISO_BIN) $(DESTDIR)$(BINDIR)
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/sudoers.d
install -m0644 ${LIVE_ETC_SUDOERS} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/sudoers.d
for l in $(LN_BUILDISO); do $(LN) buildiso $(DESTDIR)$(BINDIR)/$$l; done
install_iso:
install -dm0755 $(DESTDIR)$(PREFIX)/bin
install -m0755 ${BIN_ISO} $(DESTDIR)$(PREFIX)/bin
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install $(FILEMODE) $(ISO_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(ISO_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
ln -sf buildiso $(DESTDIR)$(PREFIX)/bin/buildiso-gremlins
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(ISO_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install -dm0755 $(DESTDIR)$(PREFIX)/lib/artools
install -m0644 ${LIBS_ISO} $(DESTDIR)$(PREFIX)/lib/artools
install: install_base install_pkg install_iso
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/initcpio/hooks
install -m0755 ${CPIOHOOKS} $(DESTDIR)$(SYSCONFDIR)/initcpio/hooks
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/initcpio/install
install -m0755 ${CPIOINST} $(DESTDIR)$(SYSCONFDIR)/initcpio/install
install -m0755 ${CPIO} $(DESTDIR)$(SYSCONFDIR)/initcpio
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools
install -m0644 ${SHARED_ISO} $(DESTDIR)$(PREFIX)/share/artools
uninstall_base:
for f in ${SYSCONF}; do rm -f $(DESTDIR)$(SYSCONFDIR)/artools/$$f; done
for f in ${BIN_BASE}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
for f in ${SHARED_BASE}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/$$f; done
for f in ${LIBS_BASE}; do rm -f $(DESTDIR)$(PREFIX)/lib/artools/$$f; done
uninstall_pkg:
for f in ${LIST_IMPORT}; do rm -f $(DESTDIR)$(SYSCONFDIR)/artools/import.list.d/$$f; done
for f in ${BIN_PKG}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides
for l in ${COMMITPKG_SYMS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
for f in ${SHARED_PKG}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/$$f; done
for f in ${PATCHES}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/patches/$$f; done
for f in ${LIBS_PKG}; do rm -f $(DESTDIR)$(PREFIX)/lib/artools/$$f; done
uninstall_isobase:
for f in ${BASE}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/$$f; done
for f in ${LIVE_ETC}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/$$f; done
for f in ${LIVE_ETC_DEFAULT}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/default/$$f; done
for f in ${LIVE_ETC_PAM}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/pam.d/$$f; done
for f in ${LIVE_ETC_SUDOERS}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/sudoers.d/$$f; done
uninstall_iso:
for f in ${BIN_ISO}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
rm -f $(DESTDIR)$(PREFIX)/bin/buildiso-gremlins
for f in ${SHARED_ISO}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/$$f; done
for f in ${LIBS_ISO}; do rm -f $(DESTDIR)$(PREFIX)/lib/artools/$$f; done
for f in ${CPIOHOOKS}; do rm -f $(DESTDIR)$(SYSCONFDIR)/initcpio/hooks/$$f; done
for f in ${CPIOINST}; do rm -f $(DESTDIR)$(SYSCONFDIR)/initcpio/install/$$f; done
for f in ${CPIO}; do rm -f $(DESTDIR)$(SYSCONFDIR)/initcpio/$$f; done
install: install_base install_pkg install_iso install_isobase
uninstall: uninstall_base uninstall_pkg uninstall_iso uninstall_isobase
dist:
git archive --format=tar --prefix=artools-$(Version)/ $(Version) | gzip -9 > artools-$(Version).tar.gz
gpg --detach-sign --use-agent artools-$(Version).tar.gz
.PHONY: all clean install uninstall dist
.PHONY: all clean install install_base install_pkg install_iso

View File

@@ -1,42 +1,67 @@
artools
=============
User manual
#### Make flags
### 1. artools.conf
* PREFIX=/usr
* SYSCONFDIR=/etc
#### Dependencies
##### Buildtime:
* make
* git
* m4
##### Runtime:
- base:
* openssh
* rsync
* haveged
* os-prober
* gnupg
* pacman
- pkg:
* namcap
* git-subrepo
* jshon
- iso:
* dosfstools
* libisoburn
* squashfs-tools
* mkinitcpio
* grub
#### Configuration
artools.conf is the central configuration file for artools.
By default, the config is installed in
~~~
/etc/artools/artools.conf
~~~
/etc/artools/artools.conf
A user artools.conf can be placed in
~~~
$HOME/.config/artools/artools.conf
~~~
$HOME/.config/artools/artools.conf
If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide
~~~
/etc/artools/artools.conf
~~~
these values take precedence over the userconfig.
These values take precedence over the userconfig.
Best practise is to leave systemwide file untouched.
By default it is commented and shows just initialization values done in code.
Tools configuration is done in artools.conf or by args.
Specifying args will override artools.conf settings.
~~~
$HOME/.config/artools/import.list.d
~~~
Both, pacman.conf and makepkg.conf for chroots are loaded from
overriding
/usr/share/artools/{makepkg,pacman-*}.conf
~~~
/etc/artools/import.list.d
~~~
and can be overridden dropping them in
$HOME/.config/artools/

View File

@@ -1,5 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -9,40 +12,49 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
shopt -s extglob
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
. @libdir@/artools/util-base.sh
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-mount.sh
display_settings(){
show_version
show_config
msg "ARGS:"
msg2 "automount: %s" "${automount}"
msg2 "run_args: %s" "${run_args[*]}"
msg "PATHS:"
msg2 "chrootdir: %s" "${chrootdir}"
select_os(){
local os_list=( $(detect) ) count=${#os_list[@]}
if [[ ${count} > 1 ]];then
msg "Detected systems:"
local i=0
for os in ${os_list[@]};do
local last=${os##*:}
case $last in
'efi') count=$((count-1)) ;;
*) info "$i) $(get_os_name $os)"; i=$((i+1)) ;;
esac
done
i=0
msg "Select system to mount [0-%s] : " "$((count-1))"
read select
else
select=0
fi
local os_str=${os_list[$select]} type
type=$os_str
root=${os_str%%:*}
type=${type##*:}
if [[ "${type##*:}" == 'linux' ]];then
msg "Mounting (%s) [%s]" "$(get_os_name $os_str)" "$root"
mount_os "$1" "$root"
else
die "You can't mount %s!" "$select"
fi
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
automount=false
pretend=false
usage() {
echo "usage: ${0##*/} -a [or] ${0##*/} chroot-dir [command]"
echo ' -a Automount detected linux system'
echo ' -q Query settings and pretend'
echo ' -h Print this help message'
echo ''
echo " If 'command' is unspecified, ${0##*/} will launch /bin/sh."
@@ -56,12 +68,11 @@ usage() {
orig_argv=("$0" "$@")
opts=':haq'
opts=':ha'
while getopts ${opts} arg; do
case "${arg}" in
a) automount=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument ${arg}"; usage 1 ;;
esac
@@ -74,8 +85,6 @@ if ${automount};then
chrootdir=/mnt
run_args=/bin/bash
${pretend} && display_settings && exit 1
select_os "${chrootdir}"
else
chrootdir=$1
@@ -84,10 +93,8 @@ else
[[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}"
${pretend} && display_settings && exit 1
chroot_api_efi_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}"
chroot_mount /etc/resolv.conf "${chrootdir}/etc/resolv.conf" --bind
chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}"
chroot_add_resolv_conf "${chrootdir}"
fi
SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" ${run_args[*]}

View File

@@ -1,4 +1,16 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
#
# Assumptions:
@@ -8,17 +20,26 @@
# 4) A valid mirror appears in /etc/pacman.d/mirrorlist
#
version=@version@
shopt -s extglob
DATADIR='@datadir@'
LIBDIR='@libdir@'
. @libdir@/artools/util-base.sh
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-mount.sh
import ${LIBDIR}/util-chroot.sh
copy_mirrorlist(){
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
}
copy_keyring(){
if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then
cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/"
fi
}
create_min_fs(){
msg "Creating install root at %s" "$1"
mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,etc}
mkdir -m 1777 -p $1/{tmp,run}
mkdir -m 0555 -p $1/{sys,proc}
}
newroot=/mnt

View File

@@ -1,5 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -9,18 +12,12 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
chroot_version=0.9
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
import ${LIBDIR}/util-mount.sh
. @libdir@/artools/util-base.sh
working_dir=''
files=()
keep_mirrors=false
nosetarch=false
usage() {
@@ -74,9 +71,14 @@ else
cache_dirs=("$cache_dir")
fi
pacconf_cmd=$(command -v pacman-conf || command -v pacconf)
host_mirrors=($($pacconf_cmd --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#'))
copy_hostconf () {
cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d"
printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pacman_conf ]] && cp $pacman_conf "$1/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp $makepkg_conf "$1/etc/makepkg.conf"
@@ -91,8 +93,9 @@ copy_hostconf () {
}
chroot_extra_mount() {
chroot_mount "/etc/resolv.conf" "$1/etc/resolv.conf" -B
chroot_mount_conditional "[[ -e $1/etc/machine-id ]]" "/etc/machine-id" "$1/etc/machine-id" -B
chroot_add_resolv_conf "$1"
chroot_mount "/etc/hosts" "$1/etc/hosts" -B
# chroot_mount_conditional "[[ -e $1/etc/machine-id ]]" "/etc/machine-id" "$1/etc/machine-id" -B
chroot_mount "${cache_dirs[0]}" "$1${cache_dirs[0]}" -B
for cache_dir in ${cache_dirs[@]:1}; do
@@ -106,6 +109,13 @@ chroot_extra_mount() {
for m in ${bindmounts_rw[@]}; do
chroot_mount "${m%%:*}" "$1${m##*:}" -B
done
for host_mirror in "${host_mirrors[@]}"; do
if [[ $host_mirror == *file://* ]]; then
host_mirror_path=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
chroot_mount "$host_mirror_path" "$1$host_mirror_path" -Br
fi
done
}
umask 0022
@@ -113,8 +123,8 @@ umask 0022
# Sanity check
if [[ ! -f "$working_dir/.artools" ]]; then
die "'%s' does not appear to be an artix chroot." "$working_dir"
elif [[ $(cat "$working_dir/.artools") != $version ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "$version"
elif [[ $(cat "$working_dir/.artools") != ${CHROOTVERSION} ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}"
fi
chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}"

View File

@@ -1,5 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -9,14 +12,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
shopt -s extglob
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util-fstab.sh
. @libdir@/artools/util-base.sh
write_source() {
local src=$1 spec= label= uuid= comment=()
@@ -73,17 +71,17 @@ optstring_apply_quirks() {
case $fstype in
f2fs)
# These are Kconfig options for f2fs. Kernels supporting the options will
# only provide the negative versions of these (e.g. noacl), and vice versa
# for kernels without support.
optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr
# These are Kconfig options for f2fs. Kernels supporting the options will
# only provide the negative versions of these (e.g. noacl), and vice versa
# for kernels without support.
optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr
;;
vfat)
# Before Linux v3.8, "cp" is prepended to the value of the codepage.
if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then
optstring_remove_option "$varname" codepage
optstring_append_option "$varname" "codepage=${codepage#cp}"
fi
# Before Linux v3.8, "cp" is prepended to the value of the codepage.
if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then
optstring_remove_option "$varname" codepage
optstring_append_option "$varname" "codepage=${codepage#cp}"
fi
;;
esac
}
@@ -93,6 +91,7 @@ usage() {
usage: ${0##*/} [options] root
Options:
-f FILTER Restrict output to mountpoints matching the prefix FILTER
-L Use labels for source identifiers (shortcut for -t LABEL)
-p Exclude pseudofs mounts (default behavior)
-P Include printing mounts
@@ -108,14 +107,15 @@ EOF
}
if [[ -z $1 || $1 = @(-h|--help) ]]; then
usage
exit $(( $# ? 0 : 1 ))
usage
exit $(( $# ? 0 : 1 ))
fi
while getopts ':LPpt:U' flag; do
while getopts ':f:LPpt:U' flag; do
case $flag in
L) bytag=LABEL ;;
U) bytag=UUID ;;
f) prefixfilter=$OPTARG ;;
P) pseudofs=1 ;;
p) pseudofs=0 ;;
t) bytag=${OPTARG^^} ;;
@@ -139,6 +139,8 @@ while read -r src target fstype opts fsroot; do
continue
fi
[[ $target = "$prefixfilter"* ]] || continue
# default 5th and 6th columns
dump=0 pass=2
@@ -158,20 +160,20 @@ while read -r src target fstype opts fsroot; do
if [[ $fsroot != / ]]; then
if [[ $fstype = btrfs ]]; then
opts+=,subvol=${fsroot#/}
opts+=,subvol=${fsroot#/}
else
# it's a bind mount
src=$(findmnt -funcevo TARGET "$src")$fsroot
if [[ $src -ef $target ]]; then
# hrmm, this is weird. we're probably looking at a file or directory
# that was bound into a chroot from the host machine. Ignore it,
# because this won't actually be a valid mount. Worst case, the user
# just re-adds it.
continue
fi
fstype=none
opts+=,bind
pass=0
# it's a bind mount
src=$(findmnt -funcevo TARGET "$src")$fsroot
if [[ $src -ef $target ]]; then
# hrmm, this is weird. we're probably looking at a file or directory
# that was bound into a chroot from the host machine. Ignore it,
# because this won't actually be a valid mount. Worst case, the user
# just re-adds it.
continue
fi
fstype=none
opts+=,bind
pass=0
fi
fi
@@ -205,22 +207,22 @@ done
while read -r device type _ _ prio; do
options=defaults
if [[ $prio != -1 ]]; then
options+=,pri=$prio
if (( prio >= 0 )); then
options+=,pri=$prio
fi
# skip files marked deleted by the kernel
[[ $device = *'\040(deleted)' ]] && continue
if [[ $type = file ]]; then
printf '%-20s' "$device"
printf '%-20s' "$device"
elif [[ $device = /dev/dm-+([0-9]) ]]; then
# device mapper doesn't allow characters we need to worry
# about being mangled, and it does the escaping of dashes
# for us in sysfs.
write_source "$(dm_name_for_devnode "$device")"
# device mapper doesn't allow characters we need to worry
# about being mangled, and it does the escaping of dashes
# for us in sysfs.
write_source "$(dm_name_for_devnode "$device")"
else
write_source "$(unmangle "$device")"
write_source "$(unmangle "$device")"
fi
printf '\t%-10s\t%-10s\t%-10s\t0 0\n\n' 'none' 'swap' "$options"

View File

@@ -1,5 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -9,30 +12,23 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
. @libdir@/artools/util-base.sh
working_dir=''
files=()
build_locales=false
keep_mirrors=false
keep_flag=''
nosetarch=false
copy_mirrorlist=true
basestrap_args=(-Gc)
usage() {
echo "Usage: ${0##*/} [options] working-dir package-list..."
echo ' options:'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -U <url> Set a specific mirror'
echo ' -c <dir> Set pacman cache'
echo ' -f <file> Copy file from the host to the chroot'
echo ' -m Do not copy mirrorlist to the chroot'
echo ' -s Do not run setarch'
echo ' -h This message'
exit 1
@@ -40,16 +36,16 @@ usage() {
orig_argv=("$0" "$@")
opts='hC:M:U:c:f:s'
opts='hC:M:c:f:sm'
while getopts ${opts} arg; do
case "${arg}" in
C) pacman_conf="$OPTARG" ;;
M) makepkg_conf="$OPTARG" ;;
U) mirror="$OPTARG" ;;
c) cache_dir="$OPTARG" ;;
f) files+=("$OPTARG") ;;
s) nosetarch=true ;;
m) copy_mirrorlist=false; basestrap_args+=(-M) ;;
h|?) usage ;;
*) error "invalid argument '%s'" "$arg"; usage ;;
esac
@@ -71,9 +67,6 @@ else
cache_dirs=(${cache_dir})
fi
basestrap_args=(-Gc ${pacman_conf:+-C "$pacman_conf"})
[[ -n ${mirror} ]] && basestrap_args+=(-M)
umask 0022
#[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir"
@@ -102,17 +95,21 @@ while read -r varname; do
_env+=("$varname=${!varname}")
done < <(declare -x | sed -r 's/^declare -x ([^=]*)=.*/\1/' | grep -i '_proxy$')
env -i "${_env[@]}" \
basestrap "${basestrap_args[@]}" "$working_dir" ${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages'
basestrap "${basestrap_args[@]}" ${pacman_conf:+-C "$pacman_conf"} "$working_dir" ${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages'
echo "$version" > "$working_dir/.artools"
echo "${CHROOTVERSION}" > "$working_dir/.artools"
default_locale "set" "$working_dir"
if [[ ! -f "$working_dir/etc/locale.gen.orig" ]];then
mv "$working_dir/etc/locale.gen" "$working_dir/etc/locale.gen.orig"
fi
printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen"
echo 'LANG=en_US.UTF-8' > "$working_dir/etc/locale.conf"
dbus-uuidgen --ensure="$working_dir"/etc/machine-id
chroot_args=(${pacman_conf:+-C "$pacman_conf"} ${makepkg_conf:+-M "$makepkg_conf"} ${cache_dir:+-c "$cache_dir"})
${nosetarch} && chroot_args+=(${nosetarch:+-s})
[[ -n ${mirror} ]] && default_mirror "$working_dir" "$mirror"
exec chroot-run \
"${chroot_args[@]}" \
"$working_dir" locale-gen

View File

@@ -1,5 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -9,16 +12,11 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
. @libdir@/artools/util-base.sh
load_user_info
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
file_to_sign="$1"
@@ -28,9 +26,10 @@ if [ ! -e "$1" ]; then
exit 1
fi
msg2 "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..."
if [[ -n "${BUILDBOT_GPGP}" ]]; then
msg2 "Signing [%s]" "${file_to_sign##*/}"
gpg --batch --passphrase "${BUILDBOT_GPGP}" --detach-sign "$file_to_sign"
else
msg2 "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..."
gpg --detach-sign --use-agent -u "${GPGKEY}" "$file_to_sign"
fi

View File

@@ -1,150 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
version=@version@
shopt -s nullglob
LIBDIR='@libdir@'
DATADIR='@datadir@'
SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
show_pkg(){
source PKGBUILD
for n in ${pkgname[@]}; do
msg2 "%s" "$n"
done
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "chroots_pkg: %s" "${chroots_pkg}"
msg2 "repository: %s" "${repository}"
msg "ARGS:"
msg2 "create_first: %s" "${create_first}"
msg2 "makepkg_args: %s" "${makepkg_args[*]}"
msg2 "mkchrootpkg_args: %s" "${mkchrootpkg_args[*]}"
msg "BUILD:"
show_pkg
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
create_first=false
pretend=false
mkchroot_args=()
mkchrootpkg_args=(-c -n)
repository='default'
prepare_build(){
local pac_file= mp_file='makepkg.conf'
base_devel=('base-devel')
case ${repository} in
'system'|'world'|'galaxy') repository='default' ;;
lib32*) base_devel+=('multilib-devel') ;;
galaxy-gremlins|galaxy-goblins) repository=${repository#*-} ;;
esac
local pac_file="pacman-${repository}.conf"
local pacman_conf="${DATADIR}/$pac_file"
[[ -f $AT_USERCONFDIR/$pac_file ]] && pacman_conf="$AT_USERCONFDIR/$pac_file"
work_dir="${chroots_pkg}/${repository}-${target_arch}"
local makepkg_conf="${DATADIR}/$mp_file"
[[ -f $AT_USERCONFDIR/$mp_file ]] && makepkg_conf="$AT_USERCONFDIR/$mp_file"
mkchroot_args+=(-C "${pacman_conf}" -M "${makepkg_conf}" "${work_dir}/root")
mkchrootpkg_args+=(-r "${work_dir}" "${makepkg_args[@]}")
}
build(){
local timer_start=$(get_timer)
exec mkchrootpkg "${mkchrootpkg_args[@]}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
usage() {
echo "Usage: ${0##*/} [options] -- [makepkg_args]"
echo " -r <dir> Repository [default: ${repository}]"
echo ' -c Create root chroot'
echo ' -q Query settings and pretend build'
echo ' -h This help'
echo ''
echo "Default makepkg_args args: ${makepkg_args[*]}"
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='r:cqh'
while getopts "${opts}" arg; do
case "${arg}" in
r) repository="$OPTARG" ;;
c) create_first=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '%s'" "${arg}"; usage 1 ;;
esac
done
makepkg_args+=("${@:$OPTIND}")
check_root
prepare_build
${pretend} && display_settings && exit
if ${create_first} || [[ ! -d ${work_dir}/root ]];then
msg "Creating chroot for [%s] (%s)..." "${repository}" "${target_arch}"
for copy in "${work_dir}"/*; do
[[ -d $copy ]] || continue
msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")"
lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy"
subvolume_delete_recursive "${copy}"
rm -rf --one-file-system "${copy}"
done
lock_close 9
rm -rf --one-file-system "${work_dir}"
mkdir -p "${work_dir}"
setarch "${target_arch}" mkchroot \
"${mkchroot_args[@]}" "${base_devel[@]}" || abort
else
lock 9 "${work_dir}/root.lock" "Locking clean chroot"
chroot-run "${mkchroot_args[@]}" \
pacman -Syu --noconfirm || abort
fi
build

View File

@@ -1,412 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
version=@version@
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
DATADIR='@datadir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
get_local_head(){
echo $(git log --pretty=%H ...refs/heads/$1^ | head -n 1)
}
get_remote_head(){
echo $(git ls-remote origin -h refs/heads/$1 | cut -f1)
}
is_dirty() {
[[ $(git diff --shortstat 2> /dev/null | tail -n1) != "" ]] || return 1
return 0
}
is_untracked(){
[[ $(git ls-files --others --exclude-standard) != "" ]] || return 1
return 0
}
pull_tree(){
local branch="master" tree="$1"
local local_head=$(get_local_head "$branch")
local remote_head=$(get_remote_head "$branch")
local timer=$(get_timer)
msg "Checking [%s] ..." "$tree"
msg2 "local: %s" "${local_head}"
msg2 "remote: %s" "${remote_head}"
if [[ "${local_head}" == "${remote_head}" ]]; then
info "nothing to do"
else
info "needs pull"
git pull origin $branch
fi
msg "Done [%s]" "$tree"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
clone_tree(){
local timer=$(get_timer) tree="$1" host_tree="$2"
msg "Preparing [%s] ..." "$tree"
info "clone"
git clone $host_tree.git
msg "Done [%s]" "$tree"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
pull_tree_arch(){
cd ${tree_dir_arch}
for tree in packages community;do
if [[ -d ${tree} ]];then
cd ${tree}
pull_tree "${tree}"
cd ..
else
clone_tree "${tree}" "${host_tree_arch}/${tree}"
fi
done
}
pull_tree_artix(){
cd ${tree_dir_artix}
for tree in packages packages-galaxy;do
if [[ -d ${tree} ]];then
cd ${tree}
git config --bool pull.rebase true
pull_tree "${tree}"
cd ..
else
clone_tree "${tree}" "${host_tree_artix}/${tree}"
fi
done
}
read_import_list(){
local tree="$1"
local _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g"
import_list=$(sed "$_com_rm" "${list_dir_import}/$tree.list" | sed "$_space" | sed "$_clean")
}
patch_pkg(){
local pkg="$1" repo="$2"
case $pkg in
'glibc')
sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
-e '/nscd.service/d' \
-i $pkg/trunk/PKGBUILD
;;
'tp_smapi'|'acpi_call'|'r8168')
sed -e 's|-ARCH|-ARTIX|g' -i $pkg/trunk/PKGBUILD
;;
'linux')
sed -e 's|-ARCH|-ARTIX|g' -i $pkg/trunk/PKGBUILD
sed -e 's|CONFIG_LOCALVERSION=.*|CONFIG_LOCALVERSION="-ARTIX"|' \
-e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
-i $pkg/trunk/config
cd $pkg/trunk
updpkgsums
cd ../..
;;
'licenses')
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' -i $pkg/trunk/PKGBUILD
;;
esac
}
get_import_path(){
local tree="$1" import_path=
case $tree in
packages) import_path=${tree_dir_arch}/packages ;;
packages-galaxy) import_path=${tree_dir_arch}/community ;;
esac
echo $import_path
}
find_repo(){
local pkg="$1" repo=
if [[ -d $pkg/repos/core-x86_64 ]];then
repo=core-x86_64
elif [[ -d $pkg/repos/core-any ]];then
repo=core-any
fi
if [[ -d $pkg/repos/extra-x86_64 ]];then
repo=extra-x86_64
elif [[ -d $pkg/repos/extra-any ]];then
repo=extra-any
fi
if [[ -d $pkg/repos/testing-x86_64 ]];then
repo=testing-x86_64
elif [[ -d $pkg/repos/testing-any ]];then
repo=testing-any
fi
if [[ -d $pkg/repos/staging-x86_64 ]];then
repo=staging-x86_64
elif [[ -d $pkg/repos/staging-any ]];then
repo=staging-any
fi
if [[ -d $pkg/repos/community-x86_64 ]];then
repo=community-x86_64
elif [[ -d $pkg/repos/community-any ]];then
repo=community-any
fi
if [[ -d $pkg/repos/community-testing-x86_64 ]];then
repo=community-testing-x86_64
elif [[ -d $pkg/repos/community-testing-any ]];then
repo=community-testing-any
fi
if [[ -d $pkg/repos/community-staging-x86_64 ]];then
repo=community-staging-x86_64
elif [[ -d $pkg/repos/community-staging-any ]];then
repo=community-staging-any
fi
if [[ -d $pkg/repos/multilib-x86_64 ]];then
repo=multilib-x86_64
fi
if [[ -d $pkg/repos/multilib-testing-x86_64 ]];then
repo=multilib-testing-x86_64
fi
if [[ -d $pkg/repos/multilib-staging-x86_64 ]];then
repo=multilib-staging-x86_64
fi
echo $repo
}
view_artix_repo(){
local repo="$1"
case $repo in
core-*) repo=system ;;
extra-*) repo=world ;;
community-*) repo=galaxy ;;
multilib-x86_64) repo=lib32 ;;
testing-*) repo=gremlins ;;
staging-*) repo=goblins ;;
multilib-testing-x86_64) repo=lib32-gremlins ;;
multilib-staging-x86_64) repo=lib32-goblins ;;
community-testing-*) repo=galaxy-gremlins ;;
community-staging-*) repo=galaxy-goblins ;;
esac
echo $repo
}
show_downgrade_table(){
msg_table_header "%-20s %-20s %-25s %-30s %-30s" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version"
for tree in packages packages-galaxy;do
for pkg_path in ${tree_dir_artix}/$tree/*; do
local artixrepo=$(find_repo "$pkg_path")
if [[ -d $pkg_path/repos/$artixrepo ]];then
source $pkg_path/repos/$artixrepo/PKGBUILD 2>/dev/null
local pkg=${pkg_path##*/}
local artixver=$(get_full_version $pkg)
local src=$(get_import_path "$tree" "$pkg")
local archrepo=$(find_repo "$src/$pkg")
if [[ -d $src/$pkg/repos/$archrepo ]];then
source $src/$pkg/repos/$archrepo/PKGBUILD 2>/dev/null
local archver=$(get_full_version $pkg)
fi
if [ $(vercmp $artixver $archver) -gt 0 ];then
local ar=$(view_artix_repo "$artixrepo")
msg_row_downgrade "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver"
fi
unset pkgver epoch pkgrel artixver archver _package
fi
done
done
}
show_upgrade_table(){
declare -A UPDATES
msg_table_header "%-20s %-20s %-25s %-30s %-30s" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version"
for tree in packages packages-galaxy;do
for pkg_path in ${tree_dir_artix}/$tree/*; do
local artixrepo=$(find_repo "$pkg_path")
if [[ -d $pkg_path/repos/$artixrepo ]];then
source $pkg_path/trunk/PKGBUILD 2>/dev/null
local pkg=${pkg_path##*/}
local artixver=$(get_full_version $pkg)
local src=$(get_import_path "$tree" "$pkg")
local archrepo=$(find_repo "$src/$pkg")
if [[ -d $src/$pkg/repos/$archrepo ]];then
source $src/$pkg/trunk/PKGBUILD 2>/dev/null
local archver=$(get_full_version $pkg)
fi
if [ $(vercmp $artixver $archver) -lt 0 ];then
local ar=$(view_artix_repo "$artixrepo")
UPDATES[$pkg]="$pkg_path/repos/$artixrepo/PKGBUILD $src/$pkg/repos/$archrepo/PKGBUILD"
msg_row_update "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver"
fi
unset pkgver epoch pkgrel artixver archver _package
fi
done
done
find "${patches_dir}/" -name *.patch -delete
for upd in "${!UPDATES[@]}"; do
diff -u ${UPDATES[$upd]} > ${patches_dir}/"$upd"-archlinux.patch
done
}
from_arch(){
local pkg="$1" archtree="$2" artixtree="$3" src= dest=
src=${tree_dir_arch}/$archtree/$pkg/trunk
dest=${tree_dir_artix}/$artixtree/$pkg/trunk
source $src/PKGBUILD 2>/dev/null
cd ${tree_dir_arch}/$archtree
msg "Package: %s" "$pkg"
local archver=$(get_full_version $pkg)
msg2 "Arch Version: %s" "$archver"
if [[ -d $dest ]];then
source $dest/PKGBUILD 2>/dev/null
cd ${tree_dir_artix}/$artixtree
local artixver=$(get_full_version $pkg)
msg2 "Artix Version: %s" "$artixver"
info "artixver: %s" "$artixver"
if [ $(vercmp $artixver $archver) -lt 0 ];then
info "Importing from archlinux (%s)" "$archtree"
rsync "${rsync_args[@]}" $src/ $dest/
patch_pkg "$pkg" "$tree"
else
warning "Versions match! Nothing to do!"
fi
else
cd ${tree_dir_artix}/$artixtree
info "Importing from archlinux (%s)" "$archtree"
mkdir $pkg
rsync "${rsync_args[@]}" $src/ $dest/
patch_pkg "$pkg" "$tree"
fi
}
import_from_arch(){
for tree in packages packages-galaxy;do
info "Importing from archlinux %s" "$tree"
read_import_list "$tree"
cd ${tree_dir_artix}/$tree
for pkg in ${import_list[@]};do
[[ "$tree" == 'packages' ]] && from_arch "$pkg" "$tree" "$tree"
[[ "$tree" == 'packages-galaxy' ]] && from_arch "$pkg" "community" "$tree"
done
done
}
sync_repos(){
pull_tree_arch
pull_tree_artix
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "package: %s" "${package}"
msg "ARGS:"
msg2 "sync: %s" "${sync}"
msg2 "upgrades: %s" "${upgrades}"
msg2 "downgrades: %s" "${downgrades}"
msg2 "import_packages: %s" "${import_packages}"
msg2 "import_community: %s" "${import_community}"
msg2 "import_all: %s" "${import_all}"
msg "PATHS:"
msg2 "tree_dir_artix: %s" "${tree_dir_artix}"
msg2 "tree_dir_arch: %s" "${tree_dir_arch}"
msg2 "patches_dir: %s" "${patches_dir}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
pretend=false
sync=false
upgrades=false
downgrades=false
import_packages=false
import_community=false
import_all=false
package=''
git_artix='packages'
git_arch='packages'
rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs)
usage() {
echo "Usage: ${0##*/} [options]"
echo ' -p <pkg> Package name'
echo " -s Clone or pull repos"
echo ' -u Show upgrade packages'
echo ' -d Show downgrade packages'
echo ' -i Import from arch packages'
echo ' -j Import from arch community'
echo ' -k Import arch packages'
echo ' -q Query settings'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='p:sudijkqh'
while getopts "${opts}" arg; do
case "${arg}" in
p) package="$OPTARG" ;;
s) sync=true ;;
u) upgrades=true ;;
d) downgrades=true ;;
i) import_packages=true ;;
j) import_community=true; git_artix='packages-galaxy'; git_arch='community' ;;
k) import_all=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
prepare_dir "${tree_dir_artix}"
prepare_dir "${tree_dir_arch}"
prepare_dir "${patches_dir}"
${pretend} && display_settings && exit 1
${sync} && sync_repos
${upgrades} && show_upgrade_table
${downgrades} && show_downgrade_table
${import_all} && import_from_arch
${import_packages} && from_arch "${package}" "${git_arch}" "${git_artix}"
${import_community} && from_arch "${package}" "${git_arch}" "${git_artix}"

View File

@@ -1,82 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-pkg.sh
shopt -s extglob
load_user_info
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
if [[ ! -f PKGBUILD ]]; then
die 'This must be run in the directory of a built package.'
fi
. ./PKGBUILD
if [[ $arch == 'any' ]]; then
CARCH='any'
fi
STARTDIR=$(pwd)
TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX)
for _pkgname in "${pkgname[@]}"; do
target_pkgver=$(get_full_version "$_pkgname")
if ! pkgfile=$(find_cached_package "$_pkgname" "$target_pkgver" "$CARCH"); then
die 'tarball not found for package: %s' "${_pkgname}-$target_pkgver"
fi
ln -s "$pkgfile" "$TEMPDIR"
pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname")
if [[ $? -ne 0 ]]; then
die "Couldn't download previous package for %s." "$_pkgname"
fi
oldpkg=${pkgurl##*://*/}
if [[ ${oldpkg##*/} = ${pkgfile##*/} ]]; then
die "The built package (%s) is the one in the repo right now!" "$_pkgname"
fi
if [[ $pkgurl = file://* ]]; then
ln -s "${pkgurl#file://}" "$TEMPDIR/$oldpkg"
elif [[ -f "$PKGDEST/$oldpkg" ]]; then
ln -s "$PKGDEST/$oldpkg" "$TEMPDIR/$oldpkg"
elif [[ -f "$STARTDIR/$oldpkg" ]]; then
ln -s "$STARTDIR/$oldpkg" "$TEMPDIR/$oldpkg"
else
curl -fsLC - --retry 3 --retry-delay 3 -o "$TEMPDIR/$oldpkg" "$pkgurl"
fi
bsdtar tf "$TEMPDIR/$oldpkg" | sort > "$TEMPDIR/filelist-$_pkgname-old"
bsdtar tf "$pkgfile" | sort > "$TEMPDIR/filelist-$_pkgname"
sdiff -s "$TEMPDIR/filelist-$_pkgname-old" "$TEMPDIR/filelist-$_pkgname"
find-libprovides "$TEMPDIR/$oldpkg" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname-old"
find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname"
if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then
msg "Sonames differ in %s!" "$_pkgname"
echo "$diff_output"
else
msg "No soname differences for %s" "$_pkgname."
fi
done

View File

@@ -1,147 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
version=@version@
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
DATADIR='@datadir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
commit_pkg(){
cd ${tree_dir_artix}/${git_tree}/${package}
source trunk/PKGBUILD
local ver=$(get_full_version ${package})
if ${remove};then
local action='remove'
local pkg=${package}-$ver
if [[ "${source_repo}" == 'trunk' ]];then
pkg=${package}
info "[%s] '%s' %s" "${source_repo}" "$pkg" "${action}"
git rm -r trunk
else
info "[%s] '%s' %s" "${source_repo}" "$pkg" "${action}"
git rm -r repos/${source_repo}-$CARCH
fi
git commit -m "[${source_repo}] '$pkg' ${action}"
${push} && git push origin master
else
local action='modify'
info "[%s] '%s' %s" "${source_repo}" "${package}-$ver" "${action}"
git add .
git commit -m "[${source_repo}] '${package}-$ver' ${action}"
${push} && git push origin master
fi
}
release_pkg(){
if [[ -d ${tree_dir_artix}/${git_tree}/${package} ]];then
cd ${tree_dir_artix}/${git_tree}/${package}
source trunk/PKGBUILD
[[ $arch == 'any' ]] && CARCH=any
if [[ ${source_repo} != 'trunk' ]];then
cd repos
dest=${target_repo}-$CARCH
action='move'
[[ -d $dest ]] && git rm -r $dest
git mv ${source_repo}-$CARCH $dest
cd ..
else
dest=${target_repo}-$CARCH
action='add'
[[ -d repos/$dest ]] && git rm -r repos/$dest
[[ ! -d repos ]] && mkdir repos
cp -r trunk repos/$dest
fi
local ver=$(get_full_version ${package})
info "[%s] -> [%s] '%s' %s" "${source_repo}" "${target_repo}" "${package}-$ver" "${action}"
git add .
git commit -m "[${source_repo}] -> [${target_repo}] '${package}-$ver' ${action}"
${push} && git push origin master
fi
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "git_tree: %s" "${git_tree}"
msg2 "source_repo: %s" "${source_repo}"
msg2 "target_repo: %s" "${target_repo}"
msg2 "package: %s" "${package}"
msg "ARGS:"
msg2 "remove: %s" "${remove}"
msg2 "push: %s" "${push}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
source_repo='trunk'
package=''
remove=false
push=false
pretend=false
git_tree='packages'
cmd=${0##*/}
target_repo=${cmd%pkg}
case ${target_repo} in
community*|multilib*) git_tree='packages-galaxy' ;;
esac
usage() {
echo "Usage: ${0##*/} [options]"
echo " -s <name> Source repository [default:${source_repo}]"
echo ' -p <pkg> Package name'
echo ' -r Delete from repo'
echo ' -u Push'
echo ' -q Query settings and pretend'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='p:s:urqh'
while getopts "${opts}" arg; do
case "${arg}" in
s) source_repo="$OPTARG" ;;
p) package="$OPTARG" ;;
r) remove=true ;;
u) push=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
${pretend} && display_settings && exit 1
if [[ "${cmd}" == 'commitpkg' ]];then
commit_pkg
else
release_pkg
fi

View File

@@ -1,101 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
version=@version@
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-iso-publish.sh
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "profile: %s" "${profile}"
msg2 "uplimit: %s kB/s" "${uplimit}"
msg "ARGS:"
msg2 "update: %s" "${update}"
msg2 "verbose: %s" "${verbose}"
msg2 "torrent: %s" "${torrent}"
if ${torrent};then
msg2 "tracker_url: %s" "${tracker_url}"
msg2 "piece_size: %s" "${piece_size}"
msg2 "host_mirrors: %s" "${host_mirrors[*]}"
msg2 "torrent_meta: %s" "${torrent_meta}"
fi
msg "REMOTE:"
msg2 "account: %s" "${account}"
msg2 "file_host: %s" "${file_host}"
msg2 "project: %s" "${project}"
msg "UPLOAD:"
msg2 "src_dir: ${src_dir}"
msg2 "target_dir: ${target_dir}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
pretend=false
update=false
verbose=false
torrent=false
rsync_args=(-aP --progress -e ssh)
usage() {
echo "Usage: ${0##*/} [options]"
echo " -p Source folder to upload [default: ${profile}]"
echo " -l Limit bandwidth in kB/s [default:${uplimit}]"
echo ' -u Update remote directory'
echo ' -t Create iso torrent'
echo ' -q Query settings and pretend upload'
echo ' -v Verbose output'
echo ' -h This help'
echo ''
echo ''
exit $1
}
opts='p:l:uvtqh'
while getopts "${opts}" arg; do
case "${arg}" in
p) profile="$OPTARG" ;;
l) uplimit="$OPTARG" ;;
u) update=true; rsync_args+=(-u) ;;
t) torrent=true ;;
v) verbose=true; rsync_args+=(-v --stats) ;;
q) pretend=true; rsync_args+=(-n) ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
timer_start=$(get_timer)
rsync_args+=(--bwlimit=${uplimit})
prepare_transfer
${pretend} && display_settings #&& exit 1
sync_dir

View File

@@ -1,121 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
version=@version@
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-pkg.sh
del_from_repo(){
local ver
local repo="$1"
local repo_path=${repos_root}/$repo/os/${target_arch}
source PKGBUILD
for name in ${pkgname[@]};do
[[ $arch == any ]] && CARCH=any
ver=$(get_full_version $name)
if pkgfile=$(find_cached_package "$name" "$ver" "$CARCH");then
info "pkgfile: %s" "${pkgfile##*/}"
repo-remove -R $repo_path/$repo.db.tar.xz $name
rm -v $repo_path/${pkgfile##*/}{,.sig}
fi
done
}
add_to_repo(){
local ver pkgfile=
local repo="$1"
local repo_path=${repos_root}/$repo/os/${target_arch}
source PKGBUILD
for name in ${pkgname[@]};do
[[ $arch == any ]] && CARCH=any
ver=$(get_full_version $name)
if pkgfile=$(find_cached_package "$name" "$ver" "$CARCH"); then
info "pkgfile: %s" "${pkgfile##*/}"
if ${sign_pkg};then
[[ -e ${pkgfile}.sig ]] && rm ${pkgfile}.sig
signfile ${pkgfile}
fi
ln -sf ${pkgfile}{,.sig} $repo_path/
repo-add -R $repo_path/$repo.db.tar.xz $pkgfile
fi
done
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "repository: %s" "${repository}"
msg "ARGS:"
msg2 "add_pkg: %s" "${add_pkg}"
msg2 "del_pkg: %s" "${del_pkg}"
msg2 "sign_pkg: %s" "${sign_pkg}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
pretend=false
add_pkg=false
del_pkg=false
repository=
sign_pkg=false
usage() {
echo "Usage: ${0##*/} [options]"
echo " -d Destination repository [default:${repository}]"
echo ' -a Add package to repository'
echo ' -r Remove package from repository'
echo ' -s Sign package'
echo ' -q Query settings and pretend upload'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='d:arsqh'
while getopts "${opts}" arg; do
case "${arg}" in
d) repository="$OPTARG" ;;
a) add_pkg=true ;;
r) del_pkg=true ;;
s) sign_pkg=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
prepare_dir "${repos_root}"
${pretend} && display_settings && exit 1
${del_pkg} && del_from_repo "${repository}"
${add_pkg} && add_to_repo "${repository}"
exit 0

View File

@@ -1,86 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util-pkg.sh
set -e
shopt -s extglob
IGNORE_INTERNAL=0
if [[ $1 = "--ignore-internal" ]]; then
IGNORE_INTERNAL=1
shift
fi
script_mode=${0##*/find-lib}
case $script_mode in
deps|provides) true;;
*) die "Unknown mode %s" "$script_mode" ;;
esac
if [[ -z $1 ]]; then
echo "${0##*/} [options] <package file|extracted package dir>"
echo "Options:"
echo " --ignore-internal ignore internal libraries"
exit 1
fi
if [[ -d $1 ]]; then
pushd $1 >/dev/null
else
WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
case ${script_mode} in
deps) bsdtar -C "$WORKDIR" -xf "$1";;
provides) bsdtar -C "$WORKDIR" -xf "$1" --include="*.so*";;
esac
pushd "$WORKDIR" >/dev/null
fi
case $script_mode in
deps) find_args=(-perm -u+x);;
provides) find_args=(-name *.so*);;
esac
find $PWD -type f "${find_args[@]}" | while read filename; do
if [[ $script_mode = "provides" ]]; then
# ignore if we don't have a shared object
if ! LC_ALL=C readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then
continue
fi
fi
# get architecture of the file; if soarch is empty it's not an ELF binary
soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p')
[[ -n $soarch ]] || continue
if [[ $script_mode = "provides" ]]; then
# get the string binaries link to: libfoo.so.1.2 -> libfoo.so.1
sofile=$(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p')
[[ -z $sofile ]] && sofile="${filename##*/}"
process_sofile "${sofile}" "${soarch}"
elif [[ $script_mode = "deps" ]]; then
# process all libraries needed by the binary
for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'); do
process_sofile "${sofile}" "${soarch}"
done
fi
done
popd >/dev/null

View File

@@ -1,48 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
match=$1
if [[ -z $match ]]; then
echo 'Usage: finddeps <depname>'
echo ''
echo 'Find packages that depend on a given depname.'
echo 'Run this script from the top-level directory of your ABS tree.'
echo ''
exit 1
fi
find $PWD -type d | while read d; do
if [[ -f "$d/PKGBUILD" ]]; then
unset pkgname depends makedepends optdepends
. "$d/PKGBUILD"
for dep in "${depends[@]}"; do
# lose the version comparator, if any
depname=${dep%%[<>=]*}
[[ $depname = $match ]] && msg "$d (depends)"
done
for dep in "${makedepends[@]}"; do
# lose the version comparator, if any
depname=${dep%%[<>=]*}
[[ $depname = $match ]] && msg "$d (makedepends)"
done
for dep in "${optdepends[@]/:*}"; do
# lose the version comaparator, if any
depname=${dep%%[<>=]*}
[[ $depname = $match ]] && msg "$d (optdepends)"
done
fi
done

View File

@@ -1,5 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -9,88 +12,54 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
DATADIR='@datadir@'
SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-iso.sh
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-iso.sh
prepare_build(){
timer_start=$(get_timer)
load_profile "${profile}"
netgroups=${netgroups_url}/netgroups-${initsys}.yaml
load_profile "${PROFILE}"
local pacman_conf pac_file="pacman-default.conf"
case "${stablility}" in
'gremlins') pac_file="pacman-${stablility}.conf" ;;
case "${REPOSITORY}" in
'gremlins'|'goblins') pac_file="pacman-${REPOSITORY}.conf" ;;
esac
pacman_conf="${DATADIR}/$pac_file"
[[ -f $AT_USERCONFDIR/$pac_file ]] && pacman_conf="$AT_USERCONFDIR/$pac_file"
[[ -f ${USERCONFDIR}/artools/$pac_file ]] && pacman_conf="${USERCONFDIR}/artools/$pac_file"
iso_file=$(gen_iso_fn).iso
mkchroot_args+=(-C ${pacman_conf})
work_dir=${chroots_iso}/${profile}/${target_arch}
iso_label="ARTIX_$(date +%Y%m)"
iso_dir="${iso_pool}/${profile}"
mkchroot_args+=(-C ${pacman_conf} -m)
work_dir=${CHROOTS_ISO}/${PROFILE}/${ARCH}
iso_root=${chroots_iso}/${profile}/iso
mnt_dir=${chroots_iso}/${profile}/mnt
iso_dir="${ISO_POOL}/${PROFILE}"
iso_root=${CHROOTS_ISO}/${PROFILE}/iso
mnt_dir=${CHROOTS_ISO}/${PROFILE}/mnt
prepare_dir "${mnt_dir}"
prepare_dir "${iso_dir}"
}
show_profile(){
msg2 "iso_file: %s" "${iso_file}"
if ${verbose};then
msg2 "autologin: %s" "${autologin}"
msg2 "netgroups: %s" "${netgroups}"
msg2 "hostname: %s" "${hostname}"
msg2 "username: %s" "${username}"
msg2 "password: %s" "${password}"
msg2 "addgroups: %s" "${addgroups}"
msg2 "services_live: %s" "${services_live[*]}"
msg2 "services: %s" "${services[*]}"
fi
prepare_dir "${iso_root}"
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "profile: %s" "${profile}"
msg2 "initsys: %s" "${initsys}"
msg2 "kernel: %s" "${kernel}"
[[ -n ${gpgkey} ]] && msg2 "gpgkey: %s" "${gpgkey}"
msg2 "stablility: %s" "${stablility}"
msg "ARGS:"
msg2 "clean_first: %s" "${clean_first}"
msg2 "images_only: %s" "${images_only}"
msg2 "iso_only: %s" "${iso_only}"
msg2 "persist: %s" "${persist}"
msg2 "PROFILE: %s" "${PROFILE}"
msg2 "INITSYS: %s" "${INITSYS}"
[[ -n ${GPG_KEY} ]] && msg2 "GPG_KEY: %s" "${GPG_KEY}"
msg "ISO SETTINGS:"
msg2 "iso_version: %s" "${iso_version}"
msg2 "ISO_VERSION: %s" "${ISO_VERSION}"
msg "BUILD:"
show_profile
}
build(){
msg "Start building [%s]" "${profile}"
msg "Start building [%s]" "${PROFILE}"
if ${clean_first};then
for copy in "${work_dir}"/*; do
[[ -d $copy ]] || continue
@@ -108,56 +77,55 @@ build(){
fi
if ${iso_only}; then
[[ ! -d ${work_dir} ]] && die "Create images: buildiso -p %s -x" "${profile}"
[[ ! -d ${work_dir} ]] && die "Create images: %s -p %s -x" "${cmd}" "${PROFILE}"
compress_images
exit 1
fi
if ${images_only}; then
prepare_images
warning "Continue compress: buildiso -p %s -zc ..." "${profile}"
warning "Continue compress: %s -p %s -zc ..." "${cmd}" "${PROFILE}"
exit 1
else
prepare_images
compress_images
fi
msg "Finished building [%s]" "${profile}"
msg "Finished building [%s]" "${PROFILE}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
clean_first=true
pretend=false
images_only=false
iso_only=false
verbose=false
log=false
persist=false
mkchroot_args=()
cmd=${0##*/}
stablility=${cmd##*-}
REPOSITORY=${cmd##*-}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -p <profile> Profile [default: ${profile}]"
echo "Usage: ${cmd} [options]"
echo " -p <profile> Profile [default: ${PROFILE}]"
echo ' -r <dir> Chroots directory'
echo " [default: ${chroots_iso}]"
echo " [default: ${CHROOTS_ISO}]"
echo ' -t <dir> Target directory'
echo " [default: ${iso_pool}]"
echo ' -k <name> Kernel to use'
echo " [default: ${kernel}]"
echo " [default: ${ISO_POOL}]"
echo ' -i <name> Init system to use'
echo " [default: ${initsys}]"
echo " [default: ${INITSYS}]"
echo ' -g <key> The gpg key for sfs signing'
echo " [default: ${gpgkey}]"
echo " [default: ${GPG_KEY}]"
echo ' -m Set SquashFS image mode to persistence'
echo ' -c Disable clean work dir'
echo ' -x Build images only'
echo ' -z Generate iso only'
echo ' Requires pre built images (-x)'
echo ' -v Verbose output to log file, show profile detail (-q)'
echo ' -l Log to file'
echo ' -q Query settings and pretend build'
echo ' -h This help'
echo ''
@@ -167,21 +135,20 @@ usage() {
orig_argv=("$0" "$@")
opts='p:r:t:k:i:g:czxmvqh'
opts='p:r:t:i:g:czxmlqh'
while getopts "${opts}" arg; do
case "${arg}" in
p) profile="$OPTARG" ;;
r) chroots_iso="$OPTARG" ;;
t) iso_pool="$OPTARG" ;;
k) kernel="$OPTARG" ;;
i) initsys="$OPTARG" ;;
g) gpgkey="$OPTARG" ;;
p) PROFILE="$OPTARG" ;;
r) CHROOTS_ISO="$OPTARG" ;;
t) ISO_POOL="$OPTARG" ;;
i) INITSYS="$OPTARG" ;;
g) GPG_KEY="$OPTARG" ;;
c) clean_first=false ;;
x) images_only=true ;;
z) iso_only=true ;;
m) persist=true ;;
v) verbose=true ;;
l) log=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;

75
bin/iso/deployiso.in Normal file
View File

@@ -0,0 +1,75 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
. @libdir@/artools/util-base.sh
connect(){
echo "${ACCOUNT}@${FILE_HOST}:${FILE_HOME}"
}
prepare_transfer(){
DEST_DIR="/iso/${PROFILE}/"
SRC_DIR="${ISO_POOL}/${PROFILE}/"
}
sync_dir(){
msg "Start upload [%s] ..." "${PROFILE}"
rsync "${rsync_args[@]}" ${SRC_DIR} $(connect)${DEST_DIR}
msg "Done upload [%s]" "${PROFILE}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
update=false
verbose=false
rsync_args=(-aP --progress -e "ssh -p ${FILE_PORT}")
usage() {
echo "Usage: ${0##*/} [options]"
echo " -p Source folder to upload [default: ${PROFILE}]"
echo " -l Limit bandwidth in kB/s [default:${UPLIMIT}]"
echo ' -u Update remote directory'
echo ' -v Verbose output'
echo ' -h This help'
echo ''
echo ''
exit $1
}
opts='p:l:uvh'
while getopts "${opts}" arg; do
case "${arg}" in
p) PROFILE="$OPTARG" ;;
l) UPLIMIT="$OPTARG" ;;
u) update=true; rsync_args+=(-u) ;;
v) verbose=true; rsync_args+=(-v --stats) ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
timer_start=$(get_timer)
rsync_args+=(--bwlimit=${UPLIMIT})
prepare_transfer
sync_dir

110
bin/pkg/buildpkg.in Normal file
View File

@@ -0,0 +1,110 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
create_first=false
mkchrootpkg_args=(-c -n)
cmd=${0##*/}
repo=${cmd#*-}
base_devel=('base-devel')
case ${repo} in
system|world|galaxy) repo='default' ;;
lib32*) base_devel+=('multilib-devel') ;;
galaxy-gremlins|galaxy-goblins) repo=${repo#*-} ;;
esac
pacman_conf="${DATADIR}/pacman-${repo}.conf"
[[ -f ${USERCONFDIR}/artools/pacman-${repo}.conf ]] && pacman_conf="${USERCONFDIR}/artools/pacman-${repo}.conf"
makepkg_conf="${DATADIR}/makepkg.conf"
[[ -f ${USERCONFDIR}/artools/makepkg.conf ]] && makepkg_conf="${USERCONFDIR}/artools/makepkg.conf"
usage() {
echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]"
echo " -r <dir> Create chroots in this directory"
echo ' -c Recreate the chroot before building'
echo ' -h This help'
echo ''
echo "Default mkchrootpkg_args args: ${mkchrootpkg_args[*]}"
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='hcr:'
while getopts "${opts}" arg; do
case "${arg}" in
r) CHROOTS_PKG="$OPTARG" ;;
c) create_first=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '%s'" "${arg}"; usage 1 ;;
esac
done
check_root SOURCE_DATE_EPOCH
mkchrootpkg_args+=("${@:$OPTIND}")
if ${create_first} || [[ ! -d "${CHROOTS_PKG}/${repo}-${ARCH}" ]];then
msg "Creating chroot for [%s] (%s)..." "${repo}" "${ARCH}"
for copy in "${CHROOTS_PKG}/${repo}-${ARCH}"/*; do
[[ -d $copy ]] || continue
msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")"
lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy"
subvolume_delete_recursive "${copy}"
rm -rf --one-file-system "${copy}"
done
lock_close 9
rm -rf --one-file-system "${CHROOTS_PKG}/${repo}-${ARCH}"
mkdir -p "${CHROOTS_PKG}/${repo}-${ARCH}"
setarch "${ARCH}" mkchroot \
-C "${pacman_conf}" \
-M "${makepkg_conf}" \
"${CHROOTS_PKG}/${repo}-${ARCH}/root" \
"${base_devel[@]}" || abort
else
lock 9 "${CHROOTS_PKG}/${repo}-${ARCH}/root.lock" "Locking clean chroot"
chroot-run \
-C "${pacman_conf}" \
-M "${makepkg_conf}" \
"${CHROOTS_PKG}/${repo}-${ARCH}/root" \
pacman -Syu --noconfirm || abort
fi
# Always build official packages reproducibly
if [[ ! -v SOURCE_DATE_EPOCH ]]; then
export SOURCE_DATE_EPOCH=$(date +%s)
fi
timer_start=$(get_timer)
msg "Building in chroot for [%s] (%s)..." "${repo}" "${ARCH}"
exec mkchrootpkg -r "${CHROOTS_PKG}/${repo}-${ARCH}" "${mkchrootpkg_args[@]}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"

204
bin/pkg/buildtree.in Normal file
View File

@@ -0,0 +1,204 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
pull_tree_arch(){
cd ${TREE_DIR_ARCH}
for tree in ${TREE_NAMES_ARCH[@]};do
if [[ -d ${tree} ]];then
cd ${tree}
pull_tree "${tree}" "$(get_local_head)" "Arch"
cd ..
else
clone_tree "${HOST_TREE_ARCH}" "${tree}" "Arch"
fi
done
}
pull_tree_artix(){
cd ${TREE_DIR_ARTIX}
for tree in ${TREE_NAMES_ARTIX[@]};do
if [[ -d ${tree} ]];then
config_tree "${tree}"
cd ${tree}
pull_tree "${tree}" "$(get_local_head)"
cd ..
else
clone_tree "${HOST_TREE_ARTIX}" "${tree}"
config_tree "${tree}"
fi
done
}
sync_pkg(){
local rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs)
local src="$1" dest="$2"
rsync "${rsync_args[@]}" $src/ $dest/
}
show_deps(){
local src="$1" repo="$2"
. $src/PKGBUILD 2>/dev/null
[[ $arch == 'any' ]] && CARCH=any
local archver=$(get_full_version $pkg)
msg2 "repo: %s" "$repo"
[[ -n ${pkgbase} ]] && msg2 "pkgbase: %s" "${pkgbase}"
msg2 "pkgname: %s" "${pkgname[*]}"
[[ -n $pkgdesc ]] && msg2 "pkgdesc: %s" "${pkgdesc}"
msg2 "Arch Version: %s" "$archver"
msg2 "arch: %s" "$CARCH"
[[ -n ${makedepends[@]} ]] && msg2 "makedepends: %s" "${makedepends[*]}"
[[ -n ${checkdepends[@]} ]] && msg2 "checkdepends: %s" "${checkdepends[*]}"
[[ -n ${depends[@]} ]] && msg2 "depends: %s" "${depends[*]}"
[[ -n ${optdepends[@]} ]] && msg2 "optdepends: %s" "${optdepends[@]}"
}
from_arch(){
local pkg="$1" src= dest=
local git_tree_arch=$(find_tree "${TREE_DIR_ARCH}" "$pkg")
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "$pkg"
local package=${TREE_DIR_ARCH}/$git_tree_arch/$pkg
local repo=$(find_repo "$package" "${staging}" "${unstable}")
src=$package/repos/$repo
local git_tree_artix=$(find_tree "${TREE_DIR_ARTIX}" "$pkg")
local tree_dir=$(get_artix_tree "$pkg" "$git_tree_artix" "$git_tree_arch")
dest=${TREE_DIR_ARTIX}/$tree_dir/$pkg/trunk
msg "tree: %s" "$tree_dir"
show_deps "$src" "$repo"
if [[ -d $dest ]];then
cd ${TREE_DIR_ARTIX}/$git_tree_artix
. $dest/PKGBUILD 2>/dev/null
local artixver=$(get_full_version $pkg)
msg2 "Artix Version: %s" "$artixver"
else
subrepo_new "$pkg" "$tree_dir" "$git_tree_arch"
fi
msg "Sync (%s) from [%s] to [%s]" "$pkg" "$git_tree_arch" "$tree_dir"
sync_pkg "$src" "$dest"
patch_pkg "$pkg"
}
view_build(){
local pkg="$1" src=
local git_tree_arch=$(find_tree "${TREE_DIR_ARCH}" "$pkg")
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "$pkg"
local pkg_path=${TREE_DIR_ARCH}/$git_tree_arch/$pkg
local repo=$(find_repo "$pkg_path" "${staging}" "${unstable}")
src=$pkg_path/repos/$repo
show_deps "$src" "$repo"
}
sync_repos(){
${sync_arch} && pull_tree_arch
${sync_artix} && pull_tree_artix
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
sync=false
sync_arch=true
sync_artix=true
import=false
view=false
createnew=false
conf=false
unstable=false
staging=true
PACKAGE=''
TEAM=${TREE_NAMES_ARTIX[0]}
GROUP=${TREE_NAMES_ARTIX[0]}
usage() {
echo "Usage: ${0##*/} [options]"
echo ' -p <pkg> Package name'
echo ' -t <team> Team name (only with -n)'
echo " [default: ${TEAM}]"
echo ' -g <group> Group name, the superrepo (only with -n)'
echo " [default: ${GROUP}]"
echo " -s Clone or pull repos"
echo " -z Don't clone or pull arch repos"
echo " -y Don't clone or pull artix repos"
echo ' -i Import a package from arch repos'
echo ' -n Make new remote subrepo and clone it'
echo ' -u Include kde & gnome unstable (only with -i)'
echo ' -w Exclude staging (only with -i)'
echo ' -v View package depends'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='p:t:g:uwsinzyvh'
while getopts "${opts}" arg; do
case "${arg}" in
p) PACKAGE="$OPTARG" ;;
t) TEAM="$OPTARG" ;;
g) GROUP="$OPTARG" ;;
s) sync=true ;;
z) sync_arch=false ;;
y) sync_artix=false ;;
i) import=true ;;
n) createnew=true ;;
w) staging=false ;;
u) unstable=true ;;
v) view=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
prepare_dir "${TREE_DIR_ARTIX}"
prepare_dir "${TREE_DIR_ARCH}"
${sync} && sync_repos
${view} && view_build "${PACKAGE}"
${import} && from_arch "${PACKAGE}"
${createnew} && subrepo_new "${PACKAGE}" "${GROUP}" "${TEAM}"

196
bin/pkg/commitpkg.in Normal file
View File

@@ -0,0 +1,196 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
get_path(){
local repo="$1" pkg=trunk/PKGBUILD
if [[ $repo != trunk ]]; then
[[ -f repos/$repo-${ARCH}/PKGBUILD ]] && pkg=repos/$repo-${ARCH}/PKGBUILD
[[ -f repos/$repo-any/PKGBUILD ]] && pkg=repos/$repo-any/PKGBUILD
fi
echo $pkg
}
prepare_commit(){
local dest="$1"
[[ -d repos/$dest ]] && git rm -r repos/$dest
[[ ! -d repos ]] && mkdir repos
[[ ! -d repos/$dest ]] && mkdir repos/$dest
}
commit_pkg(){
local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
if [[ -n ${git_tree} ]];then
cd ${TREE_DIR_ARTIX}/${git_tree}
local head=$(get_local_head)
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
local pkgbuild=$(get_path "${REPO_SRC}")
. $pkgbuild
[[ $arch == 'any' ]] && CARCH=any
local version=$(get_full_version)
local commit_msg=""
if ${remove};then
local action='remove'
if [[ "${REPO_SRC}" == 'trunk' ]];then
local pkg=${PACKAGE}
git rm -r trunk
else
local pkg="${PACKAGE}-$version"
git rm -r repos/"${REPO_SRC}-$CARCH"
fi
commit_msg="[${REPO_SRC}] '$pkg' ${action}"
msg "Action: %s" "$commit_msg"
else
local action='modify'
commit_msg="[${REPO_SRC}] '${PACKAGE}-$version' ${action}"
msg "Action: %s" "$commit_msg"
git add .
fi
git commit -m "$commit_msg"
cd ${TREE_DIR_ARTIX}/${git_tree}
${push} && pull_tree "${git_tree}" "$head"
subrepo_pull "${PACKAGE}"
subrepo_push "${PACKAGE}"
subrepo_clean "${PACKAGE}"
${push} && push_tree "${git_tree}"
git prune
else
error "Package '%s' does not exist!" "${PACKAGE}"
fi
}
symlink_commit_pkg(){
local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
if [[ -n ${git_tree} ]];then
cd ${TREE_DIR_ARTIX}/${git_tree}
local head=$(get_local_head)
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
local pkgbuild=$(get_path "${REPO_SRC}")
. $pkgbuild
[[ $arch == 'any' ]] && CARCH=any
local version=$(get_full_version)
if [[ ${REPO_SRC} == 'trunk' ]];then
local action='add'
local dest="${REPO_DEST}-$CARCH"
prepare_commit "$dest"
cp trunk/* repos/$dest/
else
local action='move'
local src="${REPO_SRC}-$CARCH" dest="${REPO_DEST}-$CARCH"
[[ ! -f repos/$src/PKGBUILD ]] && die "%s does not exist!" "repos/$src/PKGBUILD"
prepare_commit "$dest"
cp repos/$src/* repos/$dest/
git rm -r repos/$src
fi
local commit_msg="[${REPO_SRC}] -> [${REPO_DEST}] '${PACKAGE}-$version' ${action}"
msg "Action: %s" "$commit_msg"
git add .
git commit -m "$commit_msg"
cd ${TREE_DIR_ARTIX}/${git_tree}
${push} && pull_tree "${git_tree}" "$head"
subrepo_pull "${PACKAGE}"
subrepo_push "${PACKAGE}"
subrepo_clean "${PACKAGE}"
${push} && push_tree "${git_tree}"
git prune
else
error "Package '%s' does not exist!" "${PACKAGE}"
fi
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
REPO_SRC='trunk'
PACKAGE=''
remove=false
push=false
cmd=${0##*/}
REPO_DEST=${cmd%pkg}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -s <name> Source repository [default:${REPO_SRC}]"
echo ' -p <pkg> Package name'
echo ' -r Delete from repo (commitpkg only)'
echo ' -u Push'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='p:s:urh'
while getopts "${opts}" arg; do
case "${arg}" in
s) REPO_SRC="$OPTARG" ;;
p) PACKAGE="$OPTARG" ;;
r) remove=true ;;
u) push=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
if $(is_valid_repo "${REPO_SRC}");then
if [[ "${cmd}" == 'commitpkg' ]];then
commit_pkg
else
symlink_commit_pkg
fi
else
error "source repository '%s' is not valid!" "${REPO_SRC}"
fi

249
bin/pkg/comparepkg.in Normal file
View File

@@ -0,0 +1,249 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
compare(){
local pkgpath="$1" group="$2"
local pkg=${pkgpath##*/}
local artixrepo=$(find_repo "$package" "${staging}" "${unstable}")
local artixshow=${artixrepo%-*}
local pkgbuild=$pkgpath/repos/$artixrepo/PKGBUILD
if [[ -f $pkgbuild ]];then
. $pkgbuild 2>/dev/null
local artixver=$(get_full_version $pkg)
local archpath=$(get_import_path $pkg)
local archrepo=$(find_repo "$archpath" "${staging}" "${unstable}")
local archshow=${archrepo%-*}
pkgbuild=$archpath/repos/$archrepo/PKGBUILD
if [[ -f $pkgbuild ]];then
. $pkgbuild 2>/dev/null
local archver=$(get_full_version $pkg)
fi
local result=$(vercmp "$artixver" "$archver")
local repomatch=false
[[ "$archrepo" == "$artixrepo" ]] && repomatch=true
if ${move};then
if [ $result -gt -1 ];then
case $artixrepo in
*testing*|*staging*)
if $repomatch;then
msg_row "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "$group"
else
msg_row_notify "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "$group"
fi
;;
esac
fi
elif ${upgrades};then
if [ $result -eq -1 ];then
msg_row_upgrade "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "$group"
fi
elif ${downgrades};then
if [ $result -eq 1 ];then
if [[ -n $archver ]] && [[ -n $archrepo ]];then
msg_row_downgrade "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "$group"
fi
fi
fi
unset pkgver epoch pkgrel artixver archver pkgbuild archpath
fi
}
is_db_entry() {
local pkgname="$1" repo="$(arch2artix $2)"
if [[ -d ${USERCACHEDIR}/${LINKSDBEXT}/${ARCH}/$repo/$pkgname ]];then
return 0
fi
return 1
}
check_db(){
local pkgpath="$1"
local pkg=${pkgpath##*/}
local sarch=(any ${ARCH})
local arch_repos=$(arch_repos "${staging}" "${unstable}")
for repo in ${arch_repos[@]};do
for a in ${sarch[@]};do
local pkgbuild=$pkgpath/repos/$repo-$a/PKGBUILD
if [[ -f $pkgbuild ]];then
. $pkgbuild 2>/dev/null
local artixver=$(get_full_version $pkg)
local is_entry=false
for name in ${pkgname[@]};do
if is_db_entry "$name-$artixver" "$repo";then
is_entry=true
fi
if ! $is_entry; then
msg_row "${table2}" "$repo" "$name" "$artixver" "$is_entry"
fi
done
unset artixver is_entry pkgbuild pkgver epoch pkgname pkgbase
fi
done
done
}
update_db_cache(){
msg "Updating database cache"
for repo in "${searchrepos[@]}"; do
local cachedir=${USERCACHEDIR}/${LINKSDBEXT}/${ARCH}/${repo}
rm -rf "$cachedir"
mkdir -p "$cachedir"
msg2 "%s" "$repo"
curl -s "${REPOS_MIRROR}/${repo}/os/${ARCH}/${repo}.${LINKSDBEXT}" \
| bsdtar -xf - -C "$cachedir"
done
msg "Done"
}
query_db() {
msg_table_header "${table3}" "Repo" "Package" "Library"
for repo in "${searchrepos[@]}"; do
local prefix=
local db=${USERCACHEDIR}/${LINKSDBEXT}/${ARCH}/${repo}/
if [[ -d ${db} ]]; then
while read -rd '' pkg; do
read -r match
pkg=${pkg#${db}}
pkg="${pkg%/*}"
msg_row "${table3}" "${repo}" "${pkg}" "${match}"
done < <(grep -rZ "${library}" "${db}") | sort -u
fi
done
exit 0
}
show_version_table(){
if ${check};then
${sync} && update_db_cache
msg_table_header "${table2}" "Repo" "Package" "Version" "Database"
elif ${query};then
${sync} && update_db_cache
query_db
else
msg_table_header "${table}" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version" "Group"
fi
for tree in ${TREE_NAMES_ARTIX[@]};do
local git=$(find ${TREE_DIR_ARTIX}/$tree/ -mindepth 1 -maxdepth 1 -type d)
for package in ${git[@]}; do
if ${check};then
check_db "$package"
else
compare "$package" "$tree"
fi
done
done
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
unstable=false
staging=true
upgrades=false
downgrades=false
move=false
check=false
sync=false
query=false
artix_repos=(
'goblins' 'gremlins' 'system' 'world'
'galaxy-goblins' 'galaxy-gremlins' 'galaxy'
'lib32-goblins' 'lib32-gremlins' 'lib32'
'gnome-wobble' 'kde-wobble'
)
readonly table="%-20s %-20s %-25s %-25s %-25s %-20s"
readonly table2="%-20s %-35s %-20s %-10s"
readonly table3="%-20s %-45s %s"
searchrepos=(${artix_repos[@]})
usage() {
echo "Usage: ${0##*/} [options] (with -q [libname])"
echo ' -u Show upgrade packages'
echo ' -d Show downgrade packages'
echo ' -m Show packages to move'
echo " -x Don't inlcude staging packages"
echo ' -y Include unstable kde and gnome'
echo ' -c Check repos'
echo " -s Sync repo databases"
echo " -q Query repo databases for so libs"
echo ' -r <repo> Repo name to query'
echo ' [default: all]'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='r:qcsudmxyh'
while getopts "${opts}" arg; do
case "${arg}" in
u) upgrades=true ;;
d) downgrades=true ;;
m) move=true ;;
x) staging=false ;;
y) unstable=true ;;
c) check=true ;;
s) sync=true ;;
q) query=true ;;
r) searchrepos=("$OPTARG") ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
library="$1"; shift
show_version_table

105
bin/pkg/deploypkg.in Normal file
View File

@@ -0,0 +1,105 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
update_repo(){
local repo="$1" pkgfile ver
local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=()
. PKGBUILD
local pkgsearch=(${pkgname[@]})
if check_option "debug" "y"; then
pkgbase=${pkgbase:-${pkgname[@]}}
pkgsearch+=("${pkgbase}-debug")
fi
for name in ${pkgsearch[@]}; do
pkgarch=$(get_pkg_arch "$name")
ver=$(get_full_version "$name")
if pkgfile=$(find_cached_package "$name" "$ver" "$pkgarch");then
local pkg=${pkgfile##*/}
info "Found: %s" "$pkg"
if ${add_pkg};then
local action='add'
packages+=("$pkg")
# checkpkg "${pkgfile}" || return 2
if ${sign_pkg};then
[[ -e ${pkgfile}.sig ]] && rm ${pkgfile}.sig
signfile ${pkgfile}
fi
ln -sf ${pkgfile}{,.sig} $repo_path/
elif ${del_pkg};then
local action='remove'
packages+=("$name")
[[ -e $repo_path/$pkg ]] && rm $repo_path/$pkg
[[ -e $repo_path/$pkg.sig ]] && rm $repo_path/$pkg.sig
fi
fi
done
cd $repo_path
if [[ -n $action ]]; then
repo-$action -R $repo.${PKGDBEXT} ${packages[@]}
${linksdb} && links-$action $repo.${LINKSDBEXT} ${packages[@]}
fi
return 0
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
add_pkg=false
del_pkg=false
sign_pkg=false
linksdb=false
cmd=${0##*/}
dest_repo=${cmd#*-}
usage() {
echo "Usage: ${cmd} [options]"
echo ' -a Add package(s) to repository'
echo ' -r Remove package(s) from repository'
echo ' -l Use links db'
echo ' -s Sign package(s)'
echo ' -h This help'
echo ''
echo ''
exit $1
}
opts='arlsh'
while getopts "${opts}" arg; do
case "${arg}" in
a) add_pkg=true; del_pkg=false ;;
r) del_pkg=true; add_pkg=false ;;
l) linksdb=true ;;
s) sign_pkg=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
prepare_dir "${REPOS_ROOT}"
update_repo "${dest_repo}"

View File

@@ -1,5 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -9,11 +12,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
. @libdir@/artools/util-base.sh
ifs=$IFS
IFS="${IFS}:"

518
bin/pkg/links-add.in Normal file
View File

@@ -0,0 +1,518 @@
#!/bin/bash
#
# links-add - add a package to a given repo database file
# links-remove - remove a package entry from a given repo database file
#
# Copyright (c) 2006-2018 Pacman Development Team <pacman-dev@archlinux.org>
# Copyright (c) 2019 artoo@artixlinux.org
#
# 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 2 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/>.
shopt -s extglob
declare -r REPO_DB_NAME="links"
QUIET=0
ONLYADDNEW=0
SIGN=0
KEY=0
VERIFY=0
REPO_DB_FILE=
REPO_DB_PREFIX=
REPO_DB_SUFFIX=
LOCKFILE=
CLEAN_LOCK=0
. @libdir@/artools/util-base.sh
# ensure we have a sane umask set
umask 0022
# print usage instructions
usage() {
cmd=${0##*/}
printf -- "%s \n\n" "$cmd"
if [[ $cmd == "links-add" ]] ; then
printf -- "Usage: links-add [options] <path-to-db> <package> ...\n"
printf -- "\n"
printf -- "\
links-add will update a package database by reading a package file.\n\
Multiple packages to add can be specified on the command line.\n"
printf -- "\n"
printf -- "Options:\n"
printf -- " -n, --new only add packages that are not already in the database\n"
elif [[ $cmd == "links-remove" ]] ; then
printf -- "Usage: links-remove [options] <path-to-db> <packagename> ...\n"
printf -- "\n"
printf -- "\
links-remove will update a package database by removing the package name\n\
specified on the command line from the given repo database. Multiple\n\
packages to remove can be specified on the command line.\n"
printf -- "\n"
printf -- "Options:\n"
else
printf -- "Please move along, there is nothing to see here.\n"
return
fi
printf -- " --nocolor turn off color in output\n"
printf -- " -q, --quiet minimize output\n"
printf -- " -s, --sign sign database with GnuPG after update\n"
printf -- " -k, --key <key> use the specified key to sign the database\n"
printf -- " -v, --verify verify database's signature before update\n"
printf -- "\n\
See %s(8) for more details and descriptions of the available options.\n" $cmd
printf "\n"
if [[ $cmd == "links-add" ]] ; then
printf -- "Example: links-add /path/to/repo.${LINKSDBEXT} pacman-5.1.3-1-x86_64.pkg.tar.xz\n"
elif [[ $cmd == "links-remove" ]] ; then
printf -- "Example: links-remove /path/to/repo.${LINKSDBEXT} kernel26\n"
fi
}
find_pkgentry() {
local pkgname=$1
local pkgentry
for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do
name=${pkgentry##*/}
if [[ ${name%-*-*} = $pkgname ]]; then
echo $pkgentry
return 0
fi
done
return 1
}
check_gpg() {
if ! type -p gpg >/dev/null; then
error "Cannot find the gpg binary! Is GnuPG installed?"
exit 1 # $E_MISSING_PROGRAM
fi
if (( ! VERIFY )); then
if ! gpg --list-key ${GPGKEY} &>/dev/null; then
if [[ ! -z $GPGKEY ]]; then
error "The key ${GPGKEY} does not exist in your keyring."
elif (( ! KEY )); then
error "There is no key in your keyring."
fi
exit 1
fi
fi
}
# sign the package database once repackaged
create_signature() {
(( ! SIGN )) && return
local dbfile=$1
local ret=0
msg "Signing database '%s'..." "${dbfile##*/.tmp.}"
local SIGNWITHKEY=""
if [[ -n $GPGKEY ]]; then
SIGNWITHKEY="-u ${GPGKEY}"
fi
gpg --detach-sign --use-agent --no-armor ${SIGNWITHKEY} "$dbfile" &>/dev/null || ret=$?
if (( ! ret )); then
msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig"
else
warning "Failed to sign package database file '%s'" "${dbfile##*/.tmp.}"
fi
}
# verify the existing package database signature
verify_signature() {
(( ! VERIFY )) && return
local dbfile=$1
local ret=0
msg "Verifying database signature..."
if [[ ! -f $dbfile.sig ]]; then
warning "No existing signature found, skipping verification."
return
fi
gpg --verify "$dbfile.sig" || ret=$?
if (( ! ret )); then
msg2 "Database signature file verified."
else
error "Database signature was NOT valid!"
exit 1
fi
}
verify_repo_extension() {
local repofile=$1
case $repofile in
*.links.tar.gz) TAR_OPT="z" ;;
*.links.tar.bz2) TAR_OPT="j" ;;
*.links.tar.xz) TAR_OPT="J" ;;
*.links.tar.zst) TAR_OPT="--zstd" ;;
*.links.tar.Z) TAR_OPT="Z" ;;
*.links.tar) TAR_OPT="" ;;
*) error "'%s' does not have a valid database archive extension." \
"$repofile"
exit 1 ;;
esac
printf '%s' "$TAR_OPT"
}
# write an entry to the pacman database
# arg1 - path to package
db_write_entry() {
# blank out all variables
local pkgfile=$1
local pkgname pkgver
# read info from the zipped package
local line var val
while read -r line; do
[[ ${line:0:1} = '#' ]] && continue
IFS=' =' read -r var val < <(printf '%s\n' "$line")
# normalize whitespace with an extglob
declare "$var=${val//+([[:space:]])/ }"
done< <(bsdtar -xOqf "$pkgfile" .PKGINFO)
# ensure $pkgname and $pkgver variables were found
if [[ -z $pkgname || -z $pkgver ]]; then
error "Invalid package file '%s'." "$pkgfile"
return 1
fi
if [[ -d $tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver ]]; then
warning "An entry for '%s' already existed" "$pkgname-$pkgver"
if (( ONLYADDNEW )); then
return 0
fi
fi
# remove an existing entry if it exists, ignore failures
db_remove_entry "$pkgname"
local tmppkg=$tmpdir/pkg/$pkgname-$pkgver
mkdir "$tmppkg"
bsdtar -xof $pkgfile -C $tmppkg --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null
pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null
mkdir "$pkgname-$pkgver"
pushd "$pkgname-$pkgver" >/dev/null
# create links entry
msg2 "Creating '%s' db entry..." "${REPO_DB_NAME}"
local linksentry=$tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver/${REPO_DB_NAME}
for f in $(find $tmppkg -type f); do
readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'
done | sort -u > $linksentry
popd >/dev/null
popd >/dev/null
return 0
}
# remove existing entries from the DB
# arg1 - package name
db_remove_entry() {
local pkgname=$1
local notfound=1
local pkgentry=$(find_pkgentry "$pkgname")
while [[ -n $pkgentry ]]; do
notfound=0
msg2 "Removing existing entry '%s'..." \
"${pkgentry##*/}"
rm -rf "$pkgentry"
# remove entries in "links" database
local linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//')
rm -rf "$linksentry"
pkgentry=$(find_pkgentry "$pkgname")
done
return $notfound
}
prepare_repo_db() {
local repodir dbfile
# ensure the path to the DB exists; $LOCKFILE is always an absolute path
repodir=${LOCKFILE%/*}/
if [[ ! -d $repodir ]]; then
error "%s does not exist or is not a directory." "$repodir"
exit 1
fi
# check lock file
if ( set -o noclobber; echo "$$" > "$LOCKFILE") 2> /dev/null; then
CLEAN_LOCK=1
else
error "Failed to acquire lockfile: %s." "$LOCKFILE"
[[ -f $LOCKFILE ]] && error "Held by process %s" "$(cat "$LOCKFILE")"
exit 1
fi
dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX
if [[ -f $dbfile ]]; then
# there are two situations we can have here:
# a DB with some entries, or a DB with no contents at all.
if ! bsdtar -tqf "$dbfile" '*/links' >/dev/null 2>&1; then
# check empty case
if [[ -n $(bsdtar -tqf "$dbfile" '*' 2>/dev/null) ]]; then
error "Repository file '%s' is not a proper links database." "$dbfile"
exit 1
fi
fi
verify_signature "$dbfile"
msg "Extracting %s to a temporary location..." "${dbfile##*/}"
bsdtar -xf "$dbfile" -C "$tmpdir/${REPO_DB_NAME}"
else
case $cmd in
links-remove)
# only a missing "db" database is currently an error
# TODO: remove if statement
if [[ ${REPO_DB_NAME} == "links" ]]; then
error "Repository file '%s' was not found." "$dbfile"
exit 1
fi
;;
links-add)
# check if the file can be created (write permission, directory existence, etc)
if ! touch "$dbfile"; then
error "Repository file '%s' could not be created." "$dbfile"
exit 1
fi
rm -f "$dbfile"
;;
esac
fi
}
add() {
if [[ ! -f $1 ]]; then
error "File '%s' not found." "$1"
return 1
fi
pkgfile=$1
if ! bsdtar -tqf "$pkgfile" .PKGINFO >/dev/null 2>&1; then
error "'%s' is not a package file, skipping" "$pkgfile"
return 1
fi
msg "Adding package '%s'" "$pkgfile"
db_write_entry "$pkgfile"
}
remove() {
pkgname=$1
msg "Searching for package '%s'..." "$pkgname"
if ! db_remove_entry "$pkgname"; then
error "Package matching '%s' not found." "$pkgname"
return 1
fi
return 0
}
rotate_db() {
dirname=${LOCKFILE%/*}
pushd "$dirname" >/dev/null
filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX}
tempname=$dirname/.tmp.$filename
# hardlink or move the previous version of the database and signature to .old
# extension as a backup measure
if [[ -f $filename ]]; then
ln -f "$filename" "$filename.old" 2>/dev/null || \
mv -f "$filename" "$filename.old"
if [[ -f $filename.sig ]]; then
ln -f "$filename.sig" "$filename.old.sig" 2>/dev/null || \
mv -f "$filename.sig" "$filename.old.sig"
else
rm -f "$filename.old.sig"
fi
fi
# rotate the newly-created database and signature into place
mv "$tempname" "$filename"
if [[ -f $tempname.sig ]]; then
mv "$tempname.sig" "$filename.sig"
fi
dblink=${filename%.tar*}
rm -f "$dblink" "$dblink.sig"
ln -s "$filename" "$dblink" 2>/dev/null || \
ln "$filename" "$dblink" 2>/dev/null || \
cp "$filename" "$dblink"
if [[ -f "$filename.sig" ]]; then
ln -s "$filename.sig" "$dblink.sig" 2>/dev/null || \
ln "$filename.sig" "$dblink.sig" 2>/dev/null || \
cp "$filename.sig" "$dblink.sig"
fi
popd >/dev/null
}
create_db() {
TAR_OPT=$(verify_repo_extension "$REPO_DB_FILE")
# $LOCKFILE is already guaranteed to be absolute so this is safe
dirname=${LOCKFILE%/*}
filename=${REPO_DB_PREFIX}.${REPO_DB_NAME}.${REPO_DB_SUFFIX}
# this ensures we create it on the same filesystem, making moves atomic
tempname=$dirname/.tmp.$filename
pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null
if ( shopt -s nullglob; files=(*); (( ${#files[*]} )) ); then
bsdtar -c${TAR_OPT}f "$tempname" *
else
# we have no packages remaining? zip up some emptyness
warning "No packages remain, creating empty database."
bsdtar -c${TAR_OPT}f "$tempname" -T /dev/null
fi
popd >/dev/null
create_signature "$tempname"
}
trap_exit() {
# unhook all traps to avoid race conditions
trap '' EXIT TERM HUP QUIT INT ERR
echo
error "$@"
clean_up 1
}
clean_up() {
local exit_code=${1:-$?}
# unhook all traps to avoid race conditions
trap '' EXIT TERM HUP QUIT INT ERR
[[ -d $tmpdir ]] && rm -rf "$tmpdir"
(( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE"
exit $exit_code
}
# PROGRAM START
case $1 in
-h|--help) usage; exit 0;;
esac
# figure out what program we are
cmd=${0##*/}
if [[ $cmd != "links-add" && $cmd != "links-remove" ]]; then
error "Invalid command name '%s' specified." "$cmd"
exit 1
fi
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}/repo-tools.XXXXXXXXXX") || (\
error "Cannot create temp directory for database building."; \
exit 1)
for repo in "pkg" "${REPO_DB_NAME}"; do
mkdir "$tmpdir/$repo"
done
trap 'clean_up' EXIT
for signal in TERM HUP QUIT; do
trap "trap_exit \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal"
done
trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
trap 'trap_exit "$(gettext "An unknown error has occurred. Exiting...")"' ERR
declare -a args
# parse arguments
while (( $# )); do
case $1 in
-q|--quiet) QUIET=1 ;;
-n|--new) ONLYADDNEW=1 ;;
-s|--sign) SIGN=1 ;;
-k|--key) KEY=1 ; shift; GPGKEY=$1 ;;
-v|--verify) VERIFY=1 ;;
*) args+=("$1") ;;
esac
shift
done
REPO_DB_FILE=${args[0]}
if [[ -z $REPO_DB_FILE ]]; then
usage
exit 1
fi
if [[ $REPO_DB_FILE == /* ]]; then
LOCKFILE=$REPO_DB_FILE.lck
else
LOCKFILE=$PWD/$REPO_DB_FILE.lck
fi
verify_repo_extension "$REPO_DB_FILE" >/dev/null
REPO_DB_PREFIX=${REPO_DB_FILE##*/}
REPO_DB_PREFIX=${REPO_DB_PREFIX%.links.*}
REPO_DB_SUFFIX=${REPO_DB_FILE##*.links.}
if (( SIGN || VERIFY )); then
check_gpg
fi
if (( VERIFY && ${#args[@]} == 1 )); then
dbfile=${repodir}/$REPO_DB_PREFIX.${REPO_DB_NAME}.$REPO_DB_SUFFIX
if [[ -f $dbfile ]]; then
verify_signature "$dbfile"
fi
exit 0
fi
prepare_repo_db
fail=0
for arg in "${args[@]:1}"; do
case $cmd in
links-add) add "$arg" ;;
links-remove) remove "$arg" ;;
esac || fail=1
done
# if the whole operation was a success, re-zip and rotate databases
if (( !fail )); then
msg "Creating updated database file '%s'" "$REPO_DB_FILE"
create_db
rotate_db
else
msg "No packages modified, nothing to do."
exit 1
fi
exit 0

View File

@@ -1,5 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -9,13 +12,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
. @libdir@/artools/util-base.sh
shopt -s nullglob
@@ -58,35 +55,39 @@ usage() {
exit 1
}
sync_chroot() {
local chrootdir=$1
local copy=$2
local copydir=''
if [[ ${copy:0:1} = / ]]; then
copydir=$copy
else
copydir="$chrootdir/$copy"
fi
# {{{ functions
if [[ "$chrootdir/root" -ef "$copydir" ]]; then
# Usage: sync_chroot $rootdir $copydir [$copy]
sync_chroot() {
local rootdir=$1
local copydir=$2
local copy=${3:-$2}
if [[ "$rootdir" -ef "$copydir" ]]; then
error 'Cannot sync copy with itself: %s' "$copydir"
return 1
fi
# Get a read lock on the root chroot to make
# sure we don't clone a half-updated chroot
slock 8 "$chrootdir/root.lock" \
"Locking clean chroot [%s]" "$chrootdir/root"
slock 8 "$rootdir.lock" \
"Locking clean chroot [%s]" "$rootdir"
stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copydir"
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null ||
stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$rootdir" "$copy"
if is_subvolume "$rootdir" && is_same_fs "$rootdir" "$(dirname -- "$copydir")" && ! mountpoint -q "$copydir"; then
if is_subvolume "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
else
# avoid change of filesystem in case of an umount failure
rm --recursive --force --one-file-system "$copydir" ||
die "Unable to delete %s" "$copydir"
fi
btrfs subvolume snapshot "$rootdir" "$copydir" >/dev/null ||
die "Unable to create subvolume %s" "$copydir"
else
mkdir -p "$copydir"
rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
rsync -a --delete -q -W -x "$rootdir/" "$copydir"
fi
stat_done
@@ -103,7 +104,7 @@ delete_chroot() {
local copy=${1:-$2}
stat_busy "Removing chroot copy [%s]" "$copy"
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
if is_subvolume "$copydir" && ! mountpoint -q "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
else
@@ -128,7 +129,10 @@ install_packages() {
pkgnames=("${install_pkgs[@]##*/}")
cp -- "${install_pkgs[@]}" "$copydir/root/"
chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
chroot-run \
-r "${bindmounts_ro[@]}" \
-r "${bindmounts_rw[@]}" \
"$copydir" \
pacman -U --noconfirm -- "${pkgnames[@]/#//root/}"
ret=$?
rm -- "${pkgnames[@]/#/$copydir/root/}"
@@ -148,24 +152,21 @@ prepare_chroot() {
[[ $keepbuilddir = true ]] || rm -rf "$copydir/build"
local builduser_uid="${SUDO_UID:-$UID}"
local builduser_gid="$(id -g "$builduser_uid")"
local builduser_uid builduser_gid
builduser_uid="${SUDO_UID:-$UID}"
builduser_gid="$(id -g "$builduser_uid")"
local install="install -o $builduser_uid -g $builduser_gid"
local x
# We can't use useradd without chrooting, otherwise it invokes PAM modules
# which we might not be able to load (i.e. when building i686 packages on
# an x86_64 host).
sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,group}
printf >>"$copydir/etc/group" 'builduser:x:%d:\n' $builduser_gid
printf >>"$copydir/etc/passwd" 'builduser:x:%d:%d:builduser:/build:/bin/bash\n' $builduser_uid $builduser_gid
sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,shadow,group}
printf >>"$copydir/etc/group" 'builduser:x:%d:\n' "$builduser_gid"
printf >>"$copydir/etc/passwd" 'builduser:x:%d:%d:builduser:/build:/bin/bash\n' "$builduser_uid" "$builduser_gid"
printf >>"$copydir/etc/shadow" 'builduser:!!:%d::::::\n' "$(( $(date -u +%s) / 86400 ))"
$install -d "$copydir"/{build,build/.gnupg,startdir,{pkg,srcpkg,src,log}dest}
for x in .gnupg/pubring.{kbx,gpg}; do
[[ -r $USER_HOME/$x ]] || continue
$install -m 644 "$USER_HOME/$x" "$copydir/build/$x"
done
$install -d "$copydir"/{build,startdir,{pkg,srcpkg,src,log}dest}
sed -e '/^MAKEFLAGS=/d' -e '/^PACKAGER=/d' -i "$copydir/etc/makepkg.conf"
for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \
@@ -202,14 +203,23 @@ _chrootbuild() {
# No coredumps
ulimit -c 0
exec </dev/console
export LANG=C
export TERM=$TERM
. /etc/locale.conf
# shellcheck source=/dev/null
. /etc/profile
# Beware, there are some stupid arbitrary rules on how you can
# use "$" in arguments to commands with "sudo -i". ${foo} or
# ${1} is OK, but $foo or $1 isn't.
# https://bugzilla.sudo.ws/show_bug.cgi?id=765
sudo --preserve-env=SOURCE_DATE_EPOCH -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
ret=$?
case $ret in
0|14)
return 0;;
*)
return $ret;;
esac
}
_chrootnamcap() {
@@ -220,31 +230,35 @@ _chrootnamcap() {
done
}
# Usage: download_sources $copydir $src_owner
# Usage: download_sources $copydir $makepkg_user
# Globals:
# - SRCDEST
# - USER
download_sources() {
local copydir=$1
local makepkg_user=$2
local builddir
builddir="$(mktemp -d)"
chmod 1777 "$builddir"
# local builddir
# builddir="$(mktemp -d)"
# chown "$makepkg_user:" "$builddir"
setup_workdir
chown "$makepkg_user:" "$WORKDIR"
# Ensure sources are downloaded
sudo -u "$makepkg_user" env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
sudo -u "$makepkg_user" --preserve-env=GNUPGHOME \
env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o ||
die "Could not download sources."
# Clean up garbage from verifysource
rm -rf "$builddir"
# rm -rf "$builddir"
}
# Usage: move_products $copydir $owner
# Globals:
# - PKGDEST
# - LOGDEST
# - SRCPKGDEST
move_products() {
local copydir=$1
local src_owner=$2
@@ -292,8 +306,8 @@ main() {
chrootdir=
passeddir=
makepkg_user=
declare -ga install_pkgs
declare -gi ret=0
declare -a install_pkgs
declare -i ret=0
bindmounts_ro=()
bindmounts_rw=()
@@ -305,7 +319,7 @@ main() {
local opts='hcur:I:l:nTD:d:U:'
while getopts ${opts} arg; do
while getopts "${opts}" arg; do
case "$arg" in
c) clean_first=true ;;
D) bindmounts_ro+=("$OPTARG") ;;
@@ -325,7 +339,7 @@ main() {
[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.'
makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}}
check_root
check_root SOURCE_DATE_EPOCH,GNUPGHOME,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER
# Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$passeddir")
@@ -355,7 +369,7 @@ main() {
umask 0022
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
# Use PKGBUILD directory if these don't exist
@@ -368,11 +382,16 @@ main() {
lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
if [[ ! -d $copydir ]] || $clean_first; then
sync_chroot "$chrootdir" "$copy"
sync_chroot "$chrootdir/root" "$copydir" "$copy"
fi
$update_first && chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
pacman -Syu --noconfirm
bindmounts_rw+=("${PWD}:/startdir" "${SRCDEST}:/srcdest")
$update_first && chroot-run \
-r "${bindmounts_ro[*]}" \
-w "${bindmounts_rw[*]}" \
"$copydir" \
pacman -Syu --noconfirm
if [[ -n ${install_pkgs[*]:-} ]]; then
install_packages "$copydir" "${install_pkgs[@]}"
@@ -386,14 +405,16 @@ main() {
exit 1
fi
download_sources "$copydir" "$src_owner"
download_sources "$copydir" "$makepkg_user"
prepare_chroot "$copydir" "$USER_HOME" "$keepbuilddir" "$run_namcap"
bindmounts_rw+=("${PWD}:/startdir" "${SRCDEST}:/srcdest")
if chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
/chrootbuild "${makepkg_args[@]}"; then
if chroot-run \
-r "${bindmounts_ro[*]}" \
-w "${bindmounts_rw[*]}" \
"$copydir" \
/chrootbuild "${makepkg_args[@]}"
then
move_products "$copydir" "$src_owner"
else
(( ret += 1 ))

149
bin/pkg/pkg2yaml.in Normal file
View File

@@ -0,0 +1,149 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
. @libdir@/artools/util-base.sh
write_attr(){
local ident1="$1" ident2="$2" ident3="$3"
local attrname=$4 attrvalues=("${@:5}")
# normalize whitespace, strip leading and trailing
attrvalues=("${attrvalues[@]//+([[:space:]])/ }")
attrvalues=("${attrvalues[@]#[[:space:]]}")
attrvalues=("${attrvalues[@]%[[:space:]]}")
case $attrname in
makedepends|checkdepends|depends|provides|arch)
Yaml+=$(write_yaml_map $ident1 "$attrname")
for v in ${attrvalues[@]};do
Yaml+=$(write_yaml_seq $ident2 "$v")
done
;;
*)
for v in ${attrvalues[@]};do
Yaml+=$(write_yaml_map $ident3 "$attrname" "$v")
done
;;
esac
}
extract_info() {
local pkgname=$1 attrname=$2 isarray=$3 outvalue=
if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then
[[ -z $pkgname ]] && write_attr 2 4 2 "$attrname" "${outvalue[@]}"
[[ -n $pkgname ]] && write_attr 4 6 2 "$attrname" "${outvalue[@]}"
fi
}
write_details() {
local attr package_arch a
local multivalued_arch_attrs=(provides depends makedepends checkdepends)
local singlevalued=()
local multivalued=(arch provides depends checkdepends)
if [[ -z "$1" ]];then
singlevalued=(pkgver pkgrel epoch)
multivalued=(arch provides depends makedepends checkdepends)
fi
for attr in "${singlevalued[@]}"; do
extract_info "$1" "$attr" 0
done
for attr in "${multivalued[@]}"; do
extract_info "$1" "$attr" 1
done
get_pkgbuild_attribute "$1" 'arch' 1 'package_arch'
for a in "${package_arch[@]}"; do
# 'any' is special. there's no support for, e.g. depends_any.
[[ $a = any ]] && continue
for attr in "${multivalued_arch_attrs[@]}"; do
extract_info "$1" "${attr}_$a" 1
done
done
}
write_pkg_yaml(){
Yaml=$(write_yaml_header)
Yaml+=$(write_empty_line)
local full=$(get_full_version)
local ver=${full:-0}
pkgbase=${pkgbase:-${pkgname[0]}}
Yaml+=$(write_yaml_map 0 "pkgbase")
Yaml+=$(write_yaml_map 2 "pkgname" "${pkgbase}")
${details} && write_details ''
Yaml+=$(write_yaml_map 2 "fullver" "${ver}")
Yaml+=$(write_empty_line)
Yaml+=$(write_yaml_map 0 "package")
for pkg in "${pkgname[@]}"; do
Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg")
${details} && write_details "$pkg"
done
Yaml+=$(write_empty_line)
local pkgfile=$(print_all_package_names)
Yaml+=$(write_yaml_map 0 "pkgfile")
for f in ${pkgfile[@]};do
Yaml+=$(write_yaml_seq 2 "${f##*/}")
done
Yaml+=$(write_empty_line)
printf '%s' "${Yaml}"
}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -d Don't include details"
echo ' -h This help'
echo ''
exit $1
}
details=true
opts='dh'
while getopts "${opts}" arg; do
case "${arg}" in
d) details=false ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(( $OPTIND - 1 ))
[[ -f "$1"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$1"
PACKAGE="$1"/PKGBUILD; shift
. "$PACKAGE"
. /etc/makepkg.conf
write_pkg_yaml

View File

@@ -1,274 +0,0 @@
def ADD_REPO = ''
def RM_REPO = ''
def IS_ADD = 'false'
def IS_REMOVE = 'false'
def IS_BUILD = 'false'
def PKG_TRUNK = ''
def PKG_PATH = ''
pipeline {
agent any
options {
skipDefaultCheckout()
timestamps()
}
stages {
stage('Checkout') {
steps {
script {
checkout scm
def currentCommit = sh(returnStdout: true, script: 'git rev-parse @').trim()
echo "currentCommit: ${currentCommit}"
def changedFilesStatus = sh(returnStdout: true, script: "git show --pretty=format: --name-status ${currentCommit}").tokenize('\n')
def changedPkgStatus = []
def pkgPath = []
int entryCount = 0
for ( int i = 0; i < changedFilesStatus.size(); i++ ) {
def entry = changedFilesStatus[i].split()
def fileStatus = entry[0]
entryCount = entry.size()
for ( int j = 1; j < entry.size(); j++ ) {
if ( entry[j].contains('/PKGBUILD') && entry[j].contains('/repos') ){
changedPkgStatus << "${fileStatus} " + entry[j].minus('/PKGBUILD')
pkgPath << entry[j].minus('/PKGBUILD')
}
}
}
int pkgCount = changedPkgStatus.size()
int pkgPathCount = pkgPath.size()
echo "pkgCount: ${pkgCount}"
echo "entryCount: ${entryCount}"
echo "pkgPathCount: ${pkgPathCount}"
echo "changedPkgStatus: ${changedPkgStatus}"
if ( pkgCount > 0 ) {
if ( entryCount == 2 && pkgCount == 2 ) {
def pkgEntry1 = changedPkgStatus[0].split()
def pkgEntry2 = changedPkgStatus[1].split()
def srcPath = []
def pkgStatus = []
srcPath << pkgEntry1[1]
srcPath << pkgEntry2[1]
pkgStatus << pkgEntry1[0]
pkgStatus << pkgEntry2[0]
def buildInfo1 = srcPath[0].tokenize('/')
def buildInfo2 = srcPath[1].tokenize('/')
if ( pkgStatus[0] == "M" ) {
IS_ADD = 'true'
if ( srcPath[0].contains('community-testing') ) {
ADD_REPO = 'galaxy-gremlins'
} else if ( srcPath[0].contains('community-x86_64') || srcPath[0].contains('community-any') ) {
ADD_REPO = 'galaxy'
}
if ( srcPath[0].contains('multilib-testing') ) {
ADD_REPO = 'lib32-gremlins'
} else if ( srcPath[0].contains('multilib-x86_64') ) {
ADD_REPO = 'lib32'
}
} else if ( pkgStatus[1] == "M" ) {
IS_ADD = 'true'
if ( srcPath[1].contains('community-testing') ) {
ADD_REPO = 'galaxy-gremlins'
} else if ( srcPath[1].contains('community-x86_64') || srcPath[1].contains('community-any') ) {
ADD_REPO = 'galaxy'
}
if ( srcPath[1].contains('multilib-testing') ) {
ADD_REPO = 'lib32-gremlins'
} else if ( srcPath[1].contains('multilib-x86_64') ) {
ADD_REPO = 'lib32'
}
}
if ( pkgStatus[0] == "D" ) {
IS_REMOVE = 'true'
if ( srcPath[0].contains('community-testing') ) {
RM_REPO = 'galaxy-gremlins'
} else if ( srcPath[0].contains('community-x86_64') || srcPath[0].contains('community-any') ) {
RM_REPO = 'galaxy'
}
if ( srcPath[0].contains('multilib-testing') ) {
RM_REPO = 'lib32-gremlins'
} else if ( srcPath[0].contains('multilib-x86_64') ) {
RM_REPO = 'lib32'
}
} else if ( pkgStatus[1] == "D" ) {
IS_REMOVE = 'true'
if ( srcPath[1].contains('community-testing') ) {
RM_REPO = 'galaxy-gremlins'
} else if ( srcPath[1].contains('community-x86_64') || srcPath[1].contains('community-any') ) {
RM_REPO = 'galaxy'
}
if ( srcPath[1].contains('multilib-testing') ) {
RM_REPO = 'lib32-gremlins'
} else if ( srcPath[1].contains('multilib-x86_64') ) {
RM_REPO = 'lib32'
}
}
PKG_TRUNK = buildInfo1[0] + '/trunk'
}
if ( entryCount == 3 && pkgCount == 2 ) {
def pkgEntry = changedPkgStatus[0].split()
def pkgStatus = pkgEntry[0]
def buildInfo1 = pkgPath[0].tokenize('/')
def buildInfo2 = pkgPath[1].tokenize('/')
if ( pkgStatus.contains('R') ) {
IS_ADD = 'true'
IS_REMOVE = 'true'
if ( pkgPath[0].contains('community-staging') && pkgPath[1].contains('community-testing') ) {
ADD_REPO = 'galaxy-gremlins'
RM_REPO = 'galaxy-goblins'
} else if ( pkgPath[0].contains('community-testing') && pkgPath[1].contains('community-staging') ) {
ADD_REPO = 'galaxy-goblins'
RM_REPO = 'galaxy-gremlins'
}
if ( pkgPath[0].contains('community-testing') && pkgPath[1].contains('community-x86_64') || pkgPath[0].contains('community-any') ) {
ADD_REPO = 'galaxy-gremlins'
RM_REPO = 'galaxy'
} else if ( pkgPath[0].contains('community-x86_64') || pkgPath[0].contains('community-any') && pkgPath[1].contains('community-testing') ) {
ADD_REPO = 'galaxy'
RM_REPO = 'galaxy-gremlins'
}
if ( pkgPath[0].contains('multilib-staging') && pkgPath[1].contains('multilib-testing') ) {
ADD_REPO = 'lib32-gremlins'
RM_REPO = 'lib32-goblins'
} else if ( pkgPath[0].contains('multilib-testing') && pkgPath[1].contains('multilib-staging') ) {
ADD_REPO = 'lib32-goblins'
RM_REPO = 'lib32-gremlins'
}
if ( pkgPath[0].contains('multilib-testing') && pkgPath[1].contains('multilib-x86_64') ) {
ADD_REPO = 'lib32'
RM_REPO = 'lib32-gremlins'
} else if ( pkgPath[0].contains('multilib-x86_64') && pkgPath[1].contains('multilib-testing') ) {
ADD_REPO = 'lib32-gremlins'
RM_REPO = 'lib32'
}
}
PKG_TRUNK = buildInfo1[0] + '/trunk'
}
if ( pkgCount == 1 ) {
def pkgEntry = changedPkgStatus[0].split()
def pkgStatus = pkgEntry[0]
def srcPath = pkgEntry[1]
def buildInfo = srcPath.tokenize('/')
if ( srcPath.contains('community-staging') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'galaxy-goblins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('community-testing') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'galaxy-gremlins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('community-x86_64') || srcPath.contains('community-any') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'galaxy'
RM_REPO = ADD_REPO
}
if ( srcPath.contains('multilib-staging') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'lib32-goblins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('multilib-testing') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'lib32-gremlins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('multilib-x86_64') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'lib32'
RM_REPO = ADD_REPO
}
PKG_PATH = srcPath
PKG_TRUNK = buildInfo[0] + '/trunk'
}
}
}
}
}
stage('Build') {
environment {
BUILDBOT_GPGP = credentials('BUILDBOT_GPGP')
}
when {
expression { return IS_BUILD == 'true' }
}
steps {
dir("${PKG_PATH}") {
sh "buildpkg -r ${ADD_REPO}"
}
}
post {
success {
dir("${PKG_PATH}") {
sh "deploypkg -a -d ${ADD_REPO} -s"
}
}
}
}
stage('Add') {
when {
expression { return IS_ADD == 'true' }
}
steps {
dir("${PKG_TRUNK}") {
sh "deploypkg -a -d ${ADD_REPO}"
}
}
}
stage('Remove') {
when {
expression { return IS_REMOVE == 'true' }
}
steps {
dir("${PKG_TRUNK}") {
sh "deploypkg -r -d ${RM_REPO}"
}
}
}
}
}

View File

@@ -1,241 +0,0 @@
def ADD_REPO = ''
def RM_REPO = ''
def IS_ADD = 'false'
def IS_REMOVE = 'false'
def IS_BUILD = 'false'
def PKG_TRUNK = ''
def PKG_PATH = ''
pipeline {
agent any
options {
skipDefaultCheckout()
timestamps()
}
stages {
stage('Checkout') {
steps {
script {
checkout scm
def currentCommit = sh(returnStdout: true, script: 'git rev-parse @').trim()
echo "currentCommit: ${currentCommit}"
def changedFilesStatus = sh(returnStdout: true, script: "git show --pretty=format: --name-status ${currentCommit}").tokenize('\n')
def changedPkgStatus = []
def pkgPath = []
int entryCount = 0
for ( int i = 0; i < changedFilesStatus.size(); i++ ) {
def entry = changedFilesStatus[i].split()
def fileStatus = entry[0]
entryCount = entry.size()
for ( int j = 1; j < entry.size(); j++ ) {
if ( entry[j].contains('/PKGBUILD') && entry[j].contains('/repos') ){
changedPkgStatus << "${fileStatus} " + entry[j].minus('/PKGBUILD')
pkgPath << entry[j].minus('/PKGBUILD')
}
}
}
int pkgCount = changedPkgStatus.size()
int pkgPathCount = pkgPath.size()
echo "pkgCount: ${pkgCount}"
echo "entryCount: ${entryCount}"
echo "pkgPathCount: ${pkgPathCount}"
echo "changedPkgStatus: ${changedPkgStatus}"
if ( pkgCount > 0 ) {
if ( entryCount == 2 && pkgCount == 2 ) {
def pkgEntry1 = changedPkgStatus[0].split()
def pkgEntry2 = changedPkgStatus[1].split()
def srcPath = []
def pkgStatus = []
srcPath << pkgEntry1[1]
srcPath << pkgEntry2[1]
pkgStatus << pkgEntry1[0]
pkgStatus << pkgEntry2[0]
def buildInfo1 = srcPath[0].tokenize('/')
def buildInfo2 = srcPath[1].tokenize('/')
if ( pkgStatus[0] == 'M' ) {
IS_ADD = 'true'
if ( srcPath[0].contains('testing') ) {
ADD_REPO = 'gremlins'
} else if ( srcPath[0].contains('core') ) {
ADD_REPO = 'system'
} else if ( srcPath[0].contains('extra') ) {
ADD_REPO = 'world'
}
} else if ( pkgStatus[1] == 'M' ) {
IS_ADD = 'true'
if ( srcPath[1].contains('testing') ) {
ADD_REPO = 'gremlins'
} else if ( srcPath[1].contains('core') ) {
ADD_REPO = ''
} else if ( srcPath[1].contains('extra') ) {
ADD_REPO = 'world'
}
}
if ( pkgStatus[0] == 'D' ) {
IS_REMOVE = 'true'
if ( srcPath[0].contains('testing') ) {
RM_REPO = 'gremlins'
} else if ( srcPath[0].contains('core') ) {
RM_REPO = 'system'
} else if ( srcPath[0].contains('extra') ) {
RM_REPO = 'world'
}
} else if ( pkgStatus[1] == 'D' ) {
IS_REMOVE = 'true'
if ( srcPath[1].contains('testing') ) {
RM_REPO = 'gremlins'
} else if ( srcPath[1].contains('core') ) {
RM_REPO = 'system'
} else if ( srcPath[1].contains('extra') ) {
RM_REPO = 'world'
}
}
PKG_TRUNK = buildInfo1[0] + '/trunk'
}
if ( entryCount == 3 && pkgCount == 2 ) {
def pkgEntry = changedPkgStatus[0].split()
def pkgStatus = pkgEntry[0]
def buildInfo1 = pkgPath[0].tokenize('/')
def buildInfo2 = pkgPath[1].tokenize('/')
if ( pkgStatus.contains('R') ) {
IS_ADD = 'true'
IS_REMOVE = 'true'
if ( pkgPath[0].contains('staging') && pkgPath[1].contains('testing') ) {
ADD_REPO = 'gremlins'
RM_REPO = 'goblins'
} else if ( pkgPath[0].contains('testing') && pkgPath[1].contains('staging') ) {
ADD_REPO = 'goblins'
RM_REPO = 'gremlins'
}
if ( pkgPath[0].contains('core') && pkgPath[1].contains('testing')) {
ADD_REPO = 'gremlins'
RM_REPO = 'system'
} else if ( pkgPath[0].contains('testing') && pkgPath[1].contains('core')) {
ADD_REPO = 'system'
RM_REPO = 'gremlins'
}
if ( pkgPath[0].contains('extra') && pkgPath[1].contains('testing')) {
ADD_REPO = 'gremlins'
RM_REPO = 'world'
} else if ( pkgPath[0].contains('testing') && pkgPath[1].contains('extra')) {
ADD_REPO = 'world'
RM_REPO = 'gremlins'
}
if ( pkgPath[0].contains('core') && pkgPath[1].contains('extra')) {
ADD_REPO = 'world'
RM_REPO = 'system'
} else if ( pkgPath[0].contains('extra') && pkgPath[1].contains('core')) {
ADD_REPO = 'system'
RM_REPO = 'world'
}
}
PKG_TRUNK = buildInfo1[0] + '/trunk'
}
if ( pkgCount == 1 ) {
def pkgEntry = changedPkgStatus[0].split()
def pkgStatus = pkgEntry[0]
def srcPath = pkgEntry[1]
def buildInfo = srcPath.tokenize('/')
if ( srcPath.contains('staging') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'goblins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('testing') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'gremlins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('core') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'system'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('extra') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'world'
RM_REPO = ADD_REPO
}
PKG_PATH = srcPath
PKG_TRUNK = buildInfo[0] + '/trunk'
}
}
}
}
}
stage('Build') {
environment {
BUILDBOT_GPGP = credentials('BUILDBOT_GPGP')
}
when {
expression { return IS_BUILD == 'true' }
}
steps {
dir("${PKG_PATH}") {
sh "buildpkg -r ${ADD_REPO}"
}
}
post {
success {
dir("${PKG_PATH}") {
sh "deploypkg -a -d ${ADD_REPO} -s"
}
}
}
}
stage('Add') {
when {
expression { return IS_ADD == 'true' }
}
steps {
dir("${PKG_TRUNK}") {
sh "deploypkg -a -d ${ADD_REPO}"
}
}
}
stage('Remove') {
when {
expression { return IS_REMOVE == 'true' }
}
steps {
dir("${PKG_TRUNK}") {
sh "deploypkg -r -d ${RM_REPO}"
}
}
}
}
}

View File

@@ -3,60 +3,73 @@
#############################################
# build dir where buildpkg or buildiso chroots are created
# chroots_dir=/var/lib/artools
# CHROOTS_DIR=/var/lib/artools
# the workspace directory
# workspace_dir="/home/${OWNER}/artools-workspace"
# WORKSPACE_DIR="/home/${OWNER}/artools-workspace"
#############################################
################ artools-pkg ################
#############################################
# host_tree_artix='https://github.com/artix-linux'
# gitea user access token
# GIT_TOKEN=''
# host_tree_arch=git://projects.archlinux.org/svntogit
# HOST_TREE_ARTIX='gitea@gitea.artixlinux.org:artix'
# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux
# TREE_NAMES_ARTIX=(
# packages
# community
# packages-kernel
# packages-openrc
# packages-runit
# packages-media
# packages-xorg
# packages-python
# packages-perl
# packages-qt5
# packages-devel
# packages-ruby
# packages-gtk
# packages-gnome
# packages-cinnamon
# packages-lxqt
# packages-mate
# packages-kde
# )
# HOST_TREE_ARCH=git://git.archlinux.org/svntogit
# TREE_DIR_ARCH=${WORKSPACE_DIR}/archlinux
# TREE_NAMES_ARCH=(packages community)
# default repos root
# repos_root=${workspace_dir}/repos
# REPOS_ROOT=${WORKSPACE_DIR}/repos
# default mirror for sogrep
# REPOS_MIRROR="http://mirror1.artixlinux.org/repos"
#############################################
################ artools-iso ################
#############################################
# the iso storage directory
# iso_pool="${workspace_dir}/iso"
# ISO_POOL="${WORKSPACE_DIR}/iso"
# the dist release; default: auto
# iso_version=$(date +%Y%m%d)
# ISO_VERSION=$(date +%Y%m%d)
# possible values: openrc, (s6, runit) not yet supported
# initsys="openrc"
# unset defaults to given value
# kernel="linux-lts"
# custom additional kernel args
# kernel_args=""
# possible values: openrc, runit (s6 not yet supported)
# INITSYS="openrc"
# gpg key; leave empty or commented to skip sfs signing
# gpgkey=""
# GPG_KEY=""
# set upload bandwidth limit in kB/s
# uplimit=100
# the torrent tracker urls, comma separated
# tracker_url='udp://mirror.strits.dk:6969'
# file_host="sourceforge.net"
# UPLIMIT=1000
# the server user
# account=[SetUser]
# the server project
# project="artix-linux"
# host mirrors
# host_mirrors=('netcologne' 'freefr' 'netix' 'kent' '10gbps-io')
# Piece size, 2^n
# piece_size=21
# ACCOUNT=[SetUser]

View File

@@ -1,8 +0,0 @@
mkinitcpio-nfs-utils
nbd
>openrc artix-live-openrc
squashfs-tools
artix-live-portable-efi
virtualbox-guest-modules-artix
virtualbox-guest-utils
linux-lts-headers

View File

@@ -1,84 +0,0 @@
acpi
b43-fwcutter
bash
btrfs-progs
bzip2
coreutils
crda
dhclient
diffutils
dmraid
dnsmasq
dosfstools
e2fsprogs
ecryptfs-utils
exfat-utils
f2fs-tools
file
filesystem
findutils
gawk
gcc-libs
gettext
glibc
grep
grub
gzip
inetutils
#intel-ucode
iproute2
iptables
iputils
ipw2100-fw
ipw2200-fw
jfsutils
KERNEL
less
licenses
linux-firmware
logrotate
lsb-release
man-db
man-pages
memtest86+
mkinitcpio-openswap
nano
net-tools
ntfs-3g
>openrc acpid-openrc
>openrc cronie-openrc
>openrc cryptsetup-openrc
>openrc dbus-openrc
>openrc device-mapper-openrc
>openrc dhcpcd-openrc
>openrc elogind-openrc
>openrc haveged-openrc
>openrc lvm2-openrc
>openrc mdadm-openrc
>openrc netifrc
>openrc nfs-utils-openrc
>openrc rsync-openrc
>openrc wpa_supplicant-openrc
>openrc opentmpfiles
os-prober
pacman
pciutils
pcmciautils
perl
procps-ng
psmisc
reiserfsprogs
sed
shadow
s-nail
sudo
sysfsutils
tar
texinfo
usbutils
util-linux
which
efibootmgr
xfsprogs
zd1211-firmware
zsh

View File

@@ -1,49 +0,0 @@
GRUB_DEFAULT=saved
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Artix"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# If you want to enable the save default function, uncomment the following
# line, and set GRUB_DEFAULT to saved.
GRUB_SAVEDEFAULT=true
# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos"
# Uncomment to enable Hidden Menu, and optionally hide the timeout count
#GRUB_HIDDEN_TIMEOUT=5
#GRUB_HIDDEN_TIMEOUT_QUIET=true
# Uncomment to use basic console
GRUB_TERMINAL_INPUT=console
# Uncomment to disable graphical terminal
#GRUB_TERMINAL_OUTPUT=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE=auto
# Uncomment to allow the kernel use the same resolution used by grub
GRUB_GFXPAYLOAD_LINUX=keep
# Uncomment if you want GRUB to pass to the Linux kernel the old parameter
# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx"
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY=true
# Uncomment and set to the desired menu colors. Used by normal and wallpaper
# modes only. Entries specified as foreground/background.
GRUB_COLOR_NORMAL="light-gray/black"
GRUB_COLOR_HIGHLIGHT="cyan/black"
# Uncomment one of them for the gfx desired, a image background or a gfxtheme
GRUB_BACKGROUND="/usr/share/grub/background.png"
#GRUB_THEME="/path/to/gfxtheme"
# Uncomment to get a beep at GRUB start
#GRUB_INIT_TUNE="480 440 1"

View File

@@ -1,5 +0,0 @@
#
# /etc/fstab: static file system information
#
# <file system> <dir> <type> <options> <dump> <pass>
/dev/mapper/root-image / auto defaults 0 0

View File

@@ -1,13 +0,0 @@

Artix Live ISO (\l) - \s-\r \m
# Welcome to Artix #
login for the live environment:
user 'artix'
password 'artix'

View File

@@ -1,6 +0,0 @@
#%PAM-1.0
auth sufficient pam_rootok.so
auth sufficient pam_wheel.so trust use_uid
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so

View File

@@ -1 +0,0 @@
%wheel ALL=(ALL) NOPASSWD: ALL

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,9 +63,14 @@ LocalFileSigLevel = Optional
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
[gremlins]
Include = /etc/pacman.d/mirrorlist
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
#[gremlins]
#Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
@@ -73,24 +78,45 @@ Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
Include = /etc/pacman.d/mirrorlist
#[galaxy-gremlins]
#Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[lib32]
#Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[testing]
Include = /etc/pacman.d/mirrorlist-arch
#[testing]
#Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
#[community-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -0,0 +1,146 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
#TotalDownload
CheckSpace
VerbosePkgLists
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gnome-wobble]
Include = /etc/pacman.d/mirrorlist
[goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-goblins]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
#[lib32-goblins]
#Include = /etc/pacman.d/mirrorlist
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[lib32]
#Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[gnome-unstable]
Include = /etc/pacman.d/mirrorlist-arch
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,6 +63,17 @@ LocalFileSigLevel = Optional
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
@@ -70,15 +81,60 @@ Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-goblins]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
#[lib32-goblins]
#Include = /etc/pacman.d/mirrorlist
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[lib32]
#Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,9 +63,11 @@ LocalFileSigLevel = Optional
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
[goblins]
Include = /etc/pacman.d/mirrorlist
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gremlins]
Include = /etc/pacman.d/mirrorlist
@@ -76,33 +78,45 @@ Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-goblins]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[lib32]
#Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -0,0 +1,146 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# Misc options
#UseSyslog
#Color
#TotalDownload
CheckSpace
VerbosePkgLists
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[kde-wobble]
Include = /etc/pacman.d/mirrorlist
[goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-goblins]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
#[lib32-goblins]
#Include = /etc/pacman.d/mirrorlist
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[lib32]
#Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[kde-unstable]
Include = /etc/pacman.d/mirrorlist-arch
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,6 +63,11 @@ LocalFileSigLevel = Optional
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[goblins]
Include = /etc/pacman.d/mirrorlist
@@ -85,6 +90,9 @@ Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
[lib32-goblins]
Include = /etc/pacman.d/mirrorlist
@@ -94,7 +102,13 @@ Include = /etc/pacman.d/mirrorlist
[lib32]
Include = /etc/pacman.d/mirrorlist
#
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,6 +63,11 @@ LocalFileSigLevel = Optional
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[gremlins]
Include = /etc/pacman.d/mirrorlist
@@ -79,13 +84,22 @@ Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
[lib32-gremlins]
Include = /etc/pacman.d/mirrorlist
[lib32]
Include = /etc/pacman.d/mirrorlist
#
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,6 +63,14 @@ LocalFileSigLevel = Optional
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
#[gremlins]
#Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
@@ -70,21 +78,45 @@ Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
#[galaxy-gremlins]
#Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
[lib32]
Include = /etc/pacman.d/mirrorlist
#
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
#[testing]
#Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
#[community-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[multilib]
Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -1,27 +0,0 @@
################ install ################
# default displaymanager: none
# supported; lightdm, sddm, gdm, lxdm, mdm
# displaymanager="none"
# Set to false to disable autologin in the livecd
# autologin="true"
# service runlevels
# services=('acpid' 'bluetooth' 'cronie' 'cupsd' 'dbus' 'syslog-ng' 'NetworkManager')
# default values
# addgroups="video,power,storage,optical,network,lp,scanner,wheel,users"
# netgroups_url="https://raw.githubusercontent.com/artix-linux/netgroups/master"
################# live-session #################
# default value
# hostname="artix"
# default value
# username="artix"
# default value
# password="artix"

View File

@@ -1,36 +0,0 @@
acpi_call
acpi_call-lts
autoconf-archive
cmocka
confuse
dovecot
hub
hwinfo
jansson
lib32-fakeroot
lib32-libltdl
libappindicator
libbson
libdbi
libdbusmenu
libftdi
libindicator
libmongoc
libnewt
libpgm
libreplaygain
libsass
libsodium
libx86emu
ninja
pigeonhole
portaudio
r8168
r8168-lts
sassc
tp_smapi
tp_smapi-lts
virtualbox
virtualbox-guest-iso
yaml-cpp
zeromq

View File

@@ -1,74 +0,0 @@
dbus
lvm2
cryptsetup
mdadm
glibc
iptables
man-db
btrfs-progs
bash
dhcpcd
filesystem
gnupg
krb5
libusb
licenses
logrotate
mkinitcpio
pacman
pambase
procps-ng
rpcbind
util-linux
wpa_supplicant
gpm
cronie
accountsservice
alsa-utils
apache
avahi
bluez
colord
cups
dhcp
fluidsynth
git
haveged
libatasmart
libblockdev
libgudev
libinput
libwacom
lirc
mariadb
media-player-info
modemmmanger
networkmanager
openslp
polkit
pulseaudio
qt5-base
rsync
samba
sane
sddm
subversion
syslog-ng
udisks2
upower
xorg-server
xf86-input-libinput
xf86-input-evdev
xf86-video-amdgpu
xf86-video-ati
xf86-video-intel
xf86-video-nouveau
xf86-video-openchrome
xf86-video-sisusb

View File

@@ -1,55 +0,0 @@
acpi_call
acpi_call-lts
autoconf-archive
cmocka
confuse
cython
dmd
dovecot
gmock
gtest
hub
hwinfo
jansson
lib32-fakeroot
lib32-libltdl
libappindicator
libbson
libdbi
libdbusmenu
libftdi
libindicator
libmongoc
libnewt
libpgm
libphobos
libreplaygain
libsass
libsodium
libx86emu
ninja
pigeonhole
portaudio
python-babel
python-docutils
python-imagesize
python-jinja
python-pygments
python-pytz
python-snowballstemmer
python-sphinx
python-sphinx-alabaster-theme
python-sphinxcontrib-websupport
python-sphinx_rtd_theme
python-sqlalchemy
python-whoosh
r8168
r8168-lts
rust
sassc
tp_smapi
tp_smapi-lts
virtualbox
virtualbox-guest-iso
yaml-cpp
zeromq

View File

@@ -1,687 +0,0 @@
a52dec
aalib
acl
adwaita-icon-theme
alsa-firmware
alsa-lib
apr
apr-util
archlinux-keyring
argon2
aspell
assimp
atk
atkmm
at-spi2-atk
at-spi2-core
attr
autoconf
automake
b43-fwcutter
babl
# bash
bc
binutils
bison
boost
bridge-utils
brltty
bzip2
ca-certificates
ca-certificates-cacert
cairo
cairomm
cantarell-fonts
cdparanoia
check
cifs-utils
cln
cmake
convertlit
coreutils
cpio
cracklib
curl
dash
db
dbus-glib
dbus-python
dcadec
dconf
desktop-file-utils
dialog
diffutils
ding-libs
dkms
dnssec-anchors
docbook-dsssl
docbook-sgml31
docbook-utils
docbook-xml
docbook-xsl
dosfstools
dotconf
double-conversion
doxygen
e2fsprogs
ebook-tools
ed
editorconfig-core-c
efibootmgr
efivar
elfutils
exiv2
expat
extra-cmake-modules
faad2
fakeroot
ffmpeg
ffmpeg2.8
fftw
file
findutils
flac
flex
fontconfig
freetype2
fribidi
fuse2
fuse3
gamin
gawk
gc
gcab
gcc
gconf
gcr
gd
gdb
gdbm
gdk-pixbuf2
gegl02
geoip-database
gettext
ghostscript
giblib
giflib
glade
glib2
glibc
glibmm
glib-networking
glu
gmp
gnome-common
gnutls
gobject-introspection
gperf
gperftools
gpgme
gptfdisk
grantlee
graphite
graphviz
grep
groff
gsettings-desktop-schemas
gsfonts
gsm
gst-plugins-base
gst-plugins-good
gstreamer
gtk2
gtk3
gtk-doc
gtkmm3
gtk-sharp-2
gtksourceview3
gts
guile
guile2.0
gzip
harfbuzz
hdparm
hicolor-icon-theme
hunspell
hwids
hwloc
hyphen
iana-etc
icu
ifenslave
ijs
ilmbase
imagemagick
imlib2
iniparser
intltool
iproute2
iputils
ipw2100-fw
ipw2200-fw
isdn4k-utils
iso-codes
itstool
iw
jack
jasper
java8-openjdk
java-common
jbig2dec
jemalloc
jfsutils
js
json-c
jsoncpp
json-glib
kbd
keyutils
lame
lapack
lcms
lcms2
ldb
ldns
less
libaccounts-glib
libaccounts-qt
libaio
libao
libarchive
libass
libassuan
libasyncns
libatomic_ops
libavc1394
libbluray
libbsd
libburn
libbytesize
libcaca
libcanberra
libcap
libcap-ng
libcddb
libcdio
libcdio-paranoia
#libconfig
libcroco
libcue
libdaemon
libdatrie
libdbusmenu-qt
libdca
libdmtx
libdrm
libdv
libdvbpsi
libdvdcss
libdvdnav
libdvdread
libebml
libedit
libepoxy
libevdev
libevent
libexif
libffi
libfontenc
libgcrypt
libgdiplus
libgee
libgit2
libglade
libglvnd
libgpg-error
libgphoto2
libgssglue
libgusb
libical
libice
libid3tag
libidn
libidn2
libiec61883
libieee1284
libimobiledevice
libiscsi
libisoburn
libisofs
libjpeg-turbo
libksba
liblouis
liblqr
libmad
libmatroska
libmng
libmnl
libmodplug
libmpc
libmpeg2
libmspack
libmtp
libndp
libnftnl
libnghttp2
libnl
libnotify
libogg
libomxil-bellagio
libpaper
libpcap
libpciaccess
libpipeline
libplist
libpng
libproxy
libpsl
libpwquality
libqalculate
libqmi
libraqm
libraw1394
librpcsecgss
librsvg
libsamplerate
libseccomp
libsecret
libshout
libsigc++
libsigsegv
libsm
libsndfile
libsoup
libsoxr
libspiro
libsrtp
libssh
libssh2
libtar
libtasn1
libthai
libtheora
libtiff
libtirpc
libtommath
libtool
libunistring
libunwind
libupnp
libusb-compat
libusbmuxd
libutempter
libuv
libva
libvdpau
libvisual
libvorbis
libvpx
libwebp
libwmf
libx11
libxau
libxaw
libxcb
libxcomposite
libxcursor
libxdamage
libxdmcp
libxext
libxfixes
libxfont2
libxft
libxi
libxinerama
libxkbcommon
libxkbfile
libxml2
libxmu
libxpm
libxrandr
libxrender
libxres
libxshmfence
libxslt
libxss
libxt
libxtst
libxv
libxvmc
libxxf86vm
libyaml
libzip
licenses
links
linux
linux-api-headers
linux-atm
linux-firmware
linux-lts
lirc
llvm
lmdb
lua
lz4
lzo
m4
mailcap
make
man-pages
mercurial
mesa
meson
mkinitcpio-busybox
mkinitcpio-nfs-utils
mobile-broadband-provider-info
mono
mpfr
mtdev
muparser
musepack
namcap
nano
nasm
ncurses
nettle
net-tools
network-manager-applet
nfsidmap
nilfs-utils
noto-fonts
npth
nspr
nss
nss-mdns
ntfs-3g
numactl
nvidia
# nvidia-settings
nvidia-utils
ocl-icd
openal
opencore-amr
openexr
openjade
openjpeg
openjpeg2
openmpi
opensp
openssl
openssl-1.0
opus
orc
orca
p11-kit
pango
pangomm
parted
patch
pciutils
pcre
pcre2
perl
perl-error
perl-file-which
perl-xml-parser
perl-yaml
phonon
phonon-gstreamer
pinentry
pixman
pkcs11-helper
pkg-config
polkit-qt
poppler
popt
potrace
pptpclient
procinfo-ng
protobuf
psmisc
pth
pyalpm
pygobject
pygtk
# pylint
pyqt5
python
python2
# python2-backports
# python2-backports.functools_lru_cache
# python2-configparser
# python2-ipaddress
python-appdirs
python-asn1crypto
# python-astroid
python-attrs
# python-automat
python-beaker
python-cairo
# python-cffi
python-chardet
# python-constantly
# python-cryptography
python-cssselect
python-defusedxml
# python-editdistance
# python-egenix-mx-base
python-evdev
# python-feedparser
# python-fpconst
# python-gdata
# python-geoip
python-hyperlink
python-idna
# python-incremental
# python-isort
# python-iwscan
# python-lazy-object-proxy
# python-lxml
python-mako
python-markupsafe
# python-mccabe
# python-mpd
# python-nose
python-notify
python-numpy
python-packaging
python-pip
python-ply
python-pyasn1
# python-pyasn1-modules
# python-pycparser
# python-pycurl
python-pyelftools
# python-pygame
python-pyparsing
# python-rdflib
# python-requests
python-requests
# python-retrying
# python-service-identity
python-setuptools
python-six
# python-soappy
# python-telepathy
# python-urllib3
python-urllib3
python-urwid
python-virtualenv
# python-wpactrl
python-wrapt
# python-wstools
pyxdg
qt4
qt5-3d
qt5-canvas3d
qt5-charts
qt5-connectivity
qt5-datavis3d
qt5-declarative
qt5-doc
qt5-examples
qt5-gamepad
qt5-graphicaleffects
qt5-imageformats
qt5-location
qt5-multimedia
qt5-networkauth
qt5-quickcontrols
qt5-quickcontrols2
qt5-remoteobjects
qt5-script
qt5-scxml
qt5-sensors
qt5-serialbus
qt5-serialport
qt5-speech
qt5-svg
qt5-tools
qt5-translations
qt5-virtualkeyboard
qt5-wayland
qt5-webchannel
qt5-webengine
qt5-webkit
qt5-websockets
qt5-webview
qt5-x11extras
qt5-xmlpatterns
re2
readline
reiserfsprogs
rest
ruby
run-parts
schroedinger
sdl
sdl2
sdl_image
sdl_sound
sdparm
sed
serf
sgml-common
shared-mime-info
slang
s-nail
snappy
snowball
socat
sound-theme-freedesktop
source-highlight
speech-dispatcher
speex
speexdsp
sqlite
startup-notification
sudo
sysfsutils
syslinux
t1lib
taglib
talloc
tar
tcl
tdb
tevent
texinfo
texlive-bin
texlive-core
texlive-formatsextra
texlive-latexextra
texlive-pictures
texlive-science
thin-provisioning-tools
traceroute
tslib
ttf-bitstream-vera
ttf-dejavu
ttf-hack
ttf-indic-otf
tzdata
unixodbc
unzip
#usbmuxd
usbutils
v4l-utils
vala
valgrind
vi
vid.stab
volume_key
vte
vte3
vulkan-docs
vulkan-loader-layers
vulkan-tools
wavpack
wayland
wayland-protocols
webrtc-audio-processing
wget
which
whois
wireless-regdb
wireless_tools
wpa_actiond
wxgtk
x265
xapian-core
xbitmaps
xcb-proto
xcb-util
xcb-util-cursor
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdg-utils
xf86-input-libinput
xf86-video-dummy
xf86-video-fbdev
xf86-video-sisusb
xf86-video-vesa
xf86-video-vmware
xf86-video-voodoo
xfsprogs
xkeyboard-config
xmlto
xorg-bdftopcf
xorg-fonts-alias
xorg-fonts-encodings
xorg-fonts-misc
xorg-font-util
xorg-font-utils
xorg-luit
xorg-mkfontdir
xorg-mkfontscale
xorgproto
xorg-setxkbmap
xorg-twm
xorg-util-macros
xorg-xauth
# xorg-xinit
xorg-xkbcomp
xorg-xmessage
xorg-xmodmap
xorg-xprop
xorg-xrandr
xorg-xrdb
xorg-xset
xorg-xsetroot
xterm
xvidcore
xz
yajl
yelp-tools
yelp-xsl
zd1211-firmware
zip
zita-alsa-pcmi
zita-resampler
zlib
zsh
zstd
zvbi
zziplib

View File

@@ -1,5 +1,5 @@
MODULES=(loop dm-snapshot)
HOOKS=(base udev artix_shutdown artix artix_loop_mnt artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs artix_kms modconf block pcmcia filesystems keyboard keymap)
HOOKS=(base udev artix_shutdown artix artix_loop_mnt artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs artix_kms modconf block filesystems keyboard keymap)
COMPRESSION="xz"

View File

@@ -1,3 +1,6 @@
#!/hint/bash
# shellcheck disable=2034
#
# /etc/makepkg.conf
#
@@ -8,9 +11,10 @@
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
DLAGENTS=('file::/usr/bin/curl -gqC - -o %o %u'
'ftp::/usr/bin/curl -gqfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
@@ -34,11 +38,9 @@ CARCH="x86_64"
CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt"
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt"
LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now"
#-- Make Flags: change this for DistCC/SMP systems
#MAKEFLAGS="-j2"
@@ -50,7 +52,7 @@ DEBUG_CXXFLAGS="-g -fvar-tracking-assignments"
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(!distcc color !ccache check !sign)
# Defaults: BUILDENV=(!distcc !color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- distcc: Use the Distributed C/C++/ObjC compiler
@@ -73,7 +75,7 @@ BUILDENV=(!distcc color !ccache check !sign)
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !optipng !upx !debug)
# Default: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -83,11 +85,9 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#-- optipng: Optimize PNG images with optipng
#-- debug: Add debugging flags as specified in DEBUG_* variables
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !optipng !upx !debug)
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
@@ -103,6 +103,8 @@ MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info})
DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
#-- Files to be removed from all packages (if purge is specified)
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#-- Directory to store source code in for debug packages
DBGSRCDIR="/usr/src/debug"
#########################################################################
# PACKAGE OUTPUT

23
initcpio/Makefile Normal file
View File

@@ -0,0 +1,23 @@
DIRMODE = -dm0755
MODE = -m0755
CPIOHOOKS = \
$(wildcard hooks/*)
CPIOINST = \
$(wildcard install/*)
SCRIPT = \
$(wildcard script/*)
install_initcpio:
install $(DIRMODE) $(DESTDIR)$(CPIODIR)/hooks
install $(MODE) $(CPIOHOOKS) $(DESTDIR)$(CPIODIR)/hooks
install $(DIRMODE) $(DESTDIR)$(CPIODIR)/install
install $(MODE) $(CPIOINST) $(DESTDIR)$(CPIODIR)/install
install $(MODE) $(SCRIPT) $(DESTDIR)$(CPIODIR)
install: install_initcpio
.PHONY: install

View File

@@ -32,6 +32,10 @@ _mnt_dmsnapshot() {
dmsetup create ${dm_snap_name} --table "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} ${cow_chunksize}"
if [[ "${cow_persistent}" != "P" ]]; then
rm -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
fi
_mnt_dev "/dev/mapper/${dm_snap_name}" "${mnt}" "-w" "defaults"
echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/artix/used_block_devices
}

View File

@@ -7,16 +7,6 @@ build() {
add_module "via-agp"
add_module "sis-agp"
add_module "intel-agp"
if [[ $(uname -m) == i686 ]]; then
add_module "amd64-agp"
add_module "ati-agp"
add_module "sworks-agp"
add_module "ali-agp"
add_module "amd-k7-agp"
add_module "nvidia-agp"
add_module "efficeon-agp"
fi
}
help() {

View File

@@ -1,38 +0,0 @@
#!/bin/ash
# /oldroot depends on things inside /oldroot/run/miso...
mkdir /oldrun
mount -n --move /oldroot/run /oldrun
# Unmount all mounts now.
#umount $(mount | awk '$3 ~/^\/oldroot/ {print $3}' | sort -r)
umount $(mount | awk '$3 ~/^\/oldroot/ {if($3 != "/run/miso/bootmnt") print $3}' | sort -r)
# Remove all dm-snapshot devices.
dmsetup remove_all
# Remove all loopback devices.
for _lup in $(grep ^/dev/loop /oldrun/miso/used_block_devices | tac); do
if ! losetup -d ${_lup} 2> /dev/null; then
umount -d ${_lup}
fi
done
# Unmount the space used to store *.cow.
umount /oldrun/miso/cowspace
# Unmount boot device if needed (no copytoram=y used)
if [[ ! -d /oldrun/miso/copytoram ]]; then
if [[ -d /oldrun/miso/img_dev ]]; then
umount /oldrun/miso/img_dev
else
umount /oldrun/miso/bootmnt
fi
fi
# reboot / poweroff / halt, depending on the argument passed by init
# if something invalid is passed, we halt
case "$1" in
reboot|poweroff|halt) "$1" -f ;;
*) halt -f;;
esac

60
lib/base/chroot.sh Normal file
View File

@@ -0,0 +1,60 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
is_btrfs() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]]
}
is_subvolume() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]]
}
is_same_fs() {
[[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]]
}
subvolume_delete_recursive() {
local subvol
is_subvolume "$1" || return 0
while IFS= read -d $'\0' -r subvol; do
if ! subvolume_delete_recursive "$subvol"; then
return 1
fi
done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0)
if ! btrfs subvolume delete "$1" &>/dev/null; then
error "Unable to delete subvolume %s" "$subvol"
return 1
fi
return 0
}
# $1: chroot
kill_chroot_process(){
local prefix="$1" flink pid name
for root_dir in /proc/*/root; do
flink=$(readlink $root_dir)
if [ "x$flink" != "x" ]; then
if [ "x${flink:0:${#prefix}}" = "x$prefix" ]; then
# this process is in the chroot...
pid=$(basename $(dirname "$root_dir"))
name=$(ps -p $pid -o comm=)
info "Killing chroot process: %s (%s)" "$name" "$pid"
kill -9 "$pid"
fi
fi
done
}

View File

@@ -1,4 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -11,6 +15,7 @@
declare -A pseudofs_types=([anon_inodefs]=1
[autofs]=1
[bdev]=1
[bpf]=1
[binfmt_misc]=1
[cgroup]=1
[cgroup2]=1
@@ -21,6 +26,7 @@ declare -A pseudofs_types=([anon_inodefs]=1
[devpts]=1
[devtmpfs]=1
[dlmfs]=1
[efivarfs]=1
[fuse.gvfs-fuse-daemon]=1
[fusectl]=1
[hugetlbfs]=1

View File

@@ -1,4 +1,8 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
@@ -11,8 +15,6 @@
# export LC_MESSAGES=C
export LANG=C
source /usr/share/makepkg/util.sh
if [[ -t 2 ]]; then
colorize
else
@@ -62,8 +64,30 @@ slock() {
fi
}
_setup_workdir=false
setup_workdir() {
[[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
_setup_workdir=true
trap 'trap_abort' INT QUIT TERM HUP
trap 'trap_exit' EXIT
}
trap_abort() {
trap - EXIT INT QUIT TERM HUP
abort
}
trap_exit() {
local r=$?
trap - EXIT INT QUIT TERM HUP
cleanup $r
}
cleanup() {
exit ${1:-0}
if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then
rm -rf "$WORKDIR"
fi
exit "${1:-0}"
}
abort() {
@@ -78,7 +102,7 @@ die() {
msg_table_header(){
local mesg=$1; shift
printf "${GREEN} ${mesg} ${ALL_OFF}\n" "$@" >&2
printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
msg_row_downgrade(){
@@ -86,15 +110,18 @@ msg_row_downgrade(){
printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row_update(){
msg_row_notify(){
local mesg=$1; shift
printf "${RED}${BOLD} ${mesg} ${ALL_OFF}\n" "$@" >&2
printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" >&2
}
import(){
if [[ -r "$1" ]];then
source "$1"
else
die 'Could not import %s' "$1"
fi
msg_row(){
local mesg=$1; shift
# printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row_upgrade(){
local mesg=$1; shift
printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" >&2
}

148
lib/base/mount.sh Normal file
View File

@@ -0,0 +1,148 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
ignore_error() {
"$@" 2>/dev/null
return 0
}
parse_fstab(){
echo $(perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^UUID=#;' $1/etc/fstab)
# perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^/dev#;' $1/etc/fstab
# perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^LABEL=#;' $1/etc/fstab
}
detect(){
local detected="$(os-prober | tr ' ' '_' | paste -s -d ' ')"
echo ${detected}
}
# $1: os-prober array
get_os_name(){
local str=$1
str="${str#*:}"
str="${str#*:}"
str="${str%:*}"
echo "$str"
}
chroot_part_mount() {
info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}")
}
trap_setup(){
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap "$1" EXIT
}
chroot_mount() {
# info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
}
chroot_add_resolv_conf() {
local chrootdir=$1 resolv_conf=$1/etc/resolv.conf
[[ -e /etc/resolv.conf ]] || return 0
# Handle resolv.conf as a symlink to somewhere else.
if [[ -L $chrootdir/etc/resolv.conf ]]; then
# readlink(1) should always give us *something* since we know at this point
# it's a symlink. For simplicity, ignore the case of nested symlinks.
resolv_conf=$(readlink "$chrootdir/etc/resolv.conf")
if [[ $resolv_conf = /* ]]; then
resolv_conf=$chrootdir$resolv_conf
else
resolv_conf=$chrootdir/etc/$resolv_conf
fi
# ensure file exists to bind mount over
if [[ ! -f $resolv_conf ]]; then
install -Dm644 /dev/null "$resolv_conf" || return 1
fi
elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then
# The chroot might not have a resolv.conf.
return 0
fi
chroot_mount /etc/resolv.conf "$resolv_conf" --bind
}
chroot_mount_conditional() {
local cond=$1; shift
if eval "$cond"; then
chroot_mount "$@"
fi
}
chroot_setup(){
local mnt="$1" os="$2" run_args='-t tmpfs -o nosuid,nodev,mode=0755'
$os && run_args='--bind'
chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind &&
chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \
efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount /run "$mnt/run" ${run_args} &&
chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
mount_os(){
CHROOT_ACTIVE_PART_MOUNTS=()
CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_part_umount
chroot_part_mount "$2" "$1"
local mounts=$(parse_fstab "$1")
for entry in ${mounts[@]}; do
entry=${entry//UUID=}
local dev=${entry%:*} mp=${entry#*:}
case "${entry#*:}" in
'/'|'swap'|'none') continue ;;
*) chroot_part_mount "/dev/disk/by-uuid/${dev}" "$1${mp}" ;;
esac
done
chroot_setup "$1" true
chroot_add_resolv_conf "$1"
}
chroot_api_mount() {
CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_api_umount
chroot_setup "$1" false
}
chroot_api_umount() {
if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
# info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}"
fi
unset CHROOT_ACTIVE_MOUNTS
}
chroot_part_umount() {
chroot_api_umount
info "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
unset CHROOT_ACTIVE_PART_MOUNTS
}

196
lib/base/util.sh Normal file
View File

@@ -0,0 +1,196 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
get_timer(){
echo $(date +%s)
}
# $1: start timer
elapsed_time(){
echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }')
}
show_elapsed_time(){
info "Time %s: %s minutes" "$1" "$(elapsed_time $2)"
}
load_vars() {
local var
[[ -f $1 ]] || return 1
for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER CARCH GPGKEY; do
[[ -z ${!var:-} ]] && eval "$(grep -a "^${var}=" "$1")"
done
return 0
}
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p $1
}
get_disturl(){
. /usr/lib/os-release
echo "${HOME_URL}"
}
get_osname(){
. /usr/lib/os-release
echo "${NAME}"
}
init_artools_base(){
ARCH=$(uname -m)
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"/home/${OWNER}/artools-workspace"}
prepare_dir "${WORKSPACE_DIR}"
}
init_artools_pkg(){
DOMAIN='artixlinux.org'
GIT_DOMAIN="gitea.${DOMAIN}"
GIT_URL="https://${GIT_DOMAIN}"
GIT_TOKEN=${GIT_TOKEN:-''}
TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
[[ -z ${TREE_NAMES_ARTIX[@]} ]] && \
TREE_NAMES_ARTIX=(
packages
community
packages-kernel
packages-openrc
packages-runit
packages-xorg
packages-python
packages-perl
packages-qt5
packages-devel
packages-ruby
packages-gtk
packages-gnome
packages-cinnamon
packages-lxqt
packages-mate
packages-kde
)
HOST_TREE_ARTIX=${HOST_TREE_ARTIX:-"gitea@${GIT_DOMAIN}:artixlinux"}
TREE_DIR_ARCH=${TREE_DIR_ARCH:-"${WORKSPACE_DIR}/archlinux"}
TREE_NAMES_ARCH=(packages community)
HOST_TREE_ARCH=${HOST_TREE_ARCH:-'git://git.archlinux.org/svntogit'}
CHROOTS_PKG="${CHROOTS_DIR}/buildpkg"
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
REPOS_MIRROR=${REPOS_MIRROR:-'http://mirror1.artixlinux.org/repos'}
DBEXT=${DBEXT:-'xz'}
LINKSDBEXT=${LINKSDBEXT:-"links.tar.${DBEXT}"}
PKGDBEXT=${PKGDBEXT:-"db.tar.${DBEXT}"}
}
init_artools_iso(){
CHROOTS_ISO="${CHROOTS_DIR}/buildiso"
ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
prepare_dir "${ISO_POOL}"
PROFILE='base'
ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}
INITSYS=${INITSYS:-'openrc'}
GPG_KEY=${GPG_KEY:-''}
UPLIMIT=${UPLIMIT:-1000}
FILE_HOST="download.${DOMAIN}"
FILE_HOME=${FILE_HOME:-'/srv/iso'}
FILE_PORT=${FILE_PORT:-65432}
ACCOUNT=${ACCOUNT:-'naughtyISOuploader'}
}
load_config(){
local conf="$1"
[[ -f "$conf" ]] || return 1
[[ -r "$conf" ]] && . "$conf"
init_artools_base
init_artools_pkg
init_artools_iso
return 0
}
user_own(){
local flag=$2
chown ${flag} "${OWNER}:$(id --group ${OWNER})" "$1"
}
user_run(){
su ${OWNER} -c "$@"
}
load_user_info(){
OWNER=${SUDO_USER:-$USER}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}"
prepare_dir "${USERCONFDIR}"
USERCACHEDIR="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
}
# orig_argv=("$0" "$@")
check_root() {
local keepenv=$1
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo --preserve-env=$keepenv -- "${orig_argv[@]}"
else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
}

36
lib/base/yaml.sh Normal file
View File

@@ -0,0 +1,36 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
write_yaml_header(){
printf '%s' '---'
}
write_empty_line(){
printf '\n%s\n' ' '
}
write_yaml_map(){
local ident="$1" key="$2" val="$3"
printf "\n%${ident}s%s: %s\n" '' "$key" "$val"
}
write_yaml_seq(){
local ident="$1" val="$2"
printf "\n%${ident}s- %s\n" '' "$val"
}
write_yaml_seq_map(){
local ident="$1" key="$2" val="$3"
printf "\n%${ident}s- %s: %s\n" '' "$key" "$val"
}

172
lib/iso/chrootcfg.sh Normal file
View File

@@ -0,0 +1,172 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
add_svc_rc(){
local mnt="$1" name="$2" rlvl="$3"
if [[ -f $mnt/etc/init.d/$name ]];then
msg2 "Setting %s ..." "$name"
chroot $mnt rc-update add $name $rlvl &>/dev/null
fi
}
add_svc_runit(){
local mnt="$1" name="$2"
if [[ -d $mnt/etc/runit/sv/$name ]]; then
msg2 "Setting %s ..." "$name"
chroot $mnt ln -s /etc/runit/sv/$name /etc/runit/runsvdir/default &>/dev/null
fi
}
set_xdm(){
if [[ -f $1/etc/conf.d/xdm ]];then
local conf='DISPLAYMANAGER="'${DISPLAYMANAGER}'"'
sed -i -e "s|^.*DISPLAYMANAGER=.*|${conf}|" $1/etc/conf.d/xdm
fi
}
configure_hosts(){
sed -e "s|localhost.localdomain|localhost.localdomain ${HOST_NAME}|" -i $1/etc/hosts
}
configure_logind(){
local conf=$1/etc/$2/logind.conf
if [[ -e $conf ]];then
msg2 "Configuring logind ..."
sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' "$conf"
fi
}
configure_services(){
local mnt="$1"
info "Configuring [%s]" "${INITSYS}"
case ${INITSYS} in
'openrc')
for svc in ${SERVICES[@]}; do
[[ $svc == "xdm" ]] && set_xdm "$mnt"
add_svc_rc "$mnt" "$svc" "default"
done
for svc in ${SERVICES_LIVE[@]}; do
add_svc_rc "$mnt" "$svc" "default"
done
;;
'runit')
for svc in ${SERVICES[@]}; do
add_svc_runit "$mnt" "$svc"
done
for svc in ${SERVICES_LIVE[@]}; do
add_svc_runit "$mnt" "$svc"
done
;;
esac
info "Done configuring [%s]" "${INITSYS}"
}
configure_system(){
local mnt="$1"
case ${INITSYS} in
'openrc' | 'runit')
configure_logind "$mnt" "elogind"
;;
esac
echo ${HOST_NAME} > $mnt/etc/hostname
}
write_users_conf(){
local yaml=$(write_yaml_header)
yaml+=$(write_empty_line)
yaml+=$(write_yaml_map 0 'defaultGroups')
local IFS=','
for g in ${ADDGROUPS[@]};do
yaml+=$(write_yaml_seq 2 "$g")
done
unset IFS
yaml+=$(write_yaml_map 0 'autologinGroup' 'autologin')
yaml+=$(write_yaml_map 0 'doAutologin' 'false')
yaml+=$(write_yaml_map 0 'sudoersGroup' 'wheel')
yaml+=$(write_yaml_map 0 'setRootPassword' 'true')
yaml+=$(write_yaml_map 0 'availableShells' '/bin/bash, /bin/zsh')
# yaml+=$(write_yaml_map 0 'passwordRequirements')
# yaml+=$(write_yaml_map 2 'minLength' '-1')
# yaml+=$(write_yaml_map 2 'maxLength' '-1')
# yaml+=$(write_yaml_map 2 'libpwquality')
# yaml+=$(write_yaml_seq 4 "minlen=8")
# yaml+=$(write_yaml_seq 4 "minclass=80")
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_servicescfg_conf(){
local yaml=$(write_yaml_header)
yaml+=$(write_empty_line)
case "${INITSYS}" in
'runit')
yaml+=$(write_yaml_map 0 'svDir' '/etc/runit/sv')
yaml+=$(write_yaml_map 0 'runsvDir' '/etc/runit/runsvdir')
yaml+=$(write_yaml_map 0 'services')
yaml+=$(write_yaml_map 2 'enabled')
for svc in ${SERVICES[@]};do
yaml+=$(write_yaml_seq_map 4 'name' "$svc")
yaml+=$(write_yaml_map 6 'runlevel' 'default')
done
;;
'openrc')
yaml+=$(write_yaml_map 0 'initdDir' '/etc/init.d')
yaml+=$(write_yaml_map 0 'runlevelsDir' '/etc/runlevels')
yaml+=$(write_yaml_map 0 'services')
for svc in ${SERVICES[@]};do
yaml+=$(write_yaml_seq_map 2 'name' "$svc")
yaml+=$(write_yaml_map 4 'runlevel' 'default')
done
;;
esac
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_unpackfs_conf(){
local yaml=$(write_yaml_header)
yaml+=$(write_empty_line)
yaml+=$(write_yaml_map 0 'unpack')
yaml+=$(write_yaml_seq_map 2 'source' "/run/artix/bootmnt/artix/x86_64/rootfs.sfs")
yaml+=$(write_yaml_map 4 'sourcefs' 'squashfs')
yaml+=$(write_yaml_map 4 'destination' '')
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
configure_calamares(){
local mods="$1/etc/calamares/modules"
if [[ -d "$mods" ]];then
msg2 "Configuring Calamares"
write_users_conf > "$mods"/users.conf
write_servicescfg_conf > "$mods"/services-"${INITSYS}".conf
[[ -z ${DESKTOP_LIST} ]] && write_unpackfs_conf > "$mods"/unpackfs.conf
sed -e "s|openrc|${INITSYS}|" -i "$mods"/postcfg.conf
sed -e "s|services-openrc|services-${INITSYS}|" -i "$1"/etc/calamares/settings.conf
fi
}
configure_live_image(){
local fs="$1"
msg "Configuring [livefs]"
configure_hosts "$fs"
configure_system "$fs"
configure_services "$fs"
configure_calamares "$fs"
[[ ! -d "$fs/etc/artools" ]] && mkdir -p "$fs/etc/artools"
write_live_session_conf > "$fs/etc/artools/live.conf"
msg "Done configuring [livefs]"
}

View File

@@ -1,12 +1,15 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
prepare_initcpio(){
@@ -19,46 +22,50 @@ prepare_initcpio(){
prepare_initramfs(){
local mnt="$1"
cp ${DATADIR}/mkinitcpio.conf $mnt/etc/mkinitcpio-${iso_name}.conf
if [[ -n ${gpgkey} ]]; then
user_run "gpg --export ${gpgkey} >${AT_USERCONFDIR}/gpgkey"
exec 17<>${AT_USERCONFDIR}/gpgkey
cp ${DATADIR}/mkinitcpio.conf $mnt/etc/mkinitcpio-artix.conf
if [[ "${PROFILE}" != 'base' ]];then
sed -e 's/artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs //' -i $mnt/etc/mkinitcpio-artix.conf
fi
if [[ -n ${GPG_KEY} ]]; then
user_run "gpg --export ${GPG_KEY} >${USERCONFDIR}/artools/gpgkey"
exec 17<>${USERCONFDIR}/artools/GPG_KEY
fi
local _kernel=$(cat $mnt/usr/lib/modules/*/version)
ARTIX_GNUPG_FD=${gpgkey:+17} chroot-run $mnt \
ARTIX_GNUPG_FD=${GPG_KEY:+17} chroot-run $mnt \
/usr/bin/mkinitcpio -k ${_kernel} \
-c /etc/mkinitcpio-${iso_name}.conf \
-c /etc/mkinitcpio-artix.conf \
-g /boot/initramfs.img
if [[ -n ${gpgkey} ]]; then
if [[ -n ${GPG_KEY} ]]; then
exec 17<&-
fi
if [[ -f ${AT_USERCONFDIR}/gpgkey ]]; then
rm ${AT_USERCONFDIR}/gpgkey
if [[ -f ${USERCONFDIR}/artools/GPG_KEY ]]; then
rm ${USERCONFDIR}/artools/GPG_KEY
fi
}
prepare_boot_extras(){
local src="$1" dest="$2"
# cp $src/boot/intel-ucode.img $dest/intel_ucode.img
# cp $src/usr/share/licenses/intel-ucode/LICENSE $dest/intel_ucode.LICENSE
for u in intel amd;do
cp $src/boot/$u-ucode.img $dest/$u-ucode.img
cp $src/usr/share/licenses/$u-ucode/LICENSE $dest/$u-ucode.LICENSE
done
cp $src/boot/memtest86+/memtest.bin $dest/memtest
cp $src/usr/share/licenses/common/GPL2/license.txt $dest/memtest.COPYING
}
configure_grub(){
local conf="$1"
sed -e "s|@arch@|${target_arch}|g" \
-e "s|@iso_label@|${iso_label}|" \
-e "s|@iso_name@|${iso_name}|g" \
-e "s|@kernel_args@|${kernel_args}|g" \
-i $conf
local conf="$1/boot/grub/kernels.cfg"
sed -e "s|@iso_label@|${iso_label}|" -i $conf
}
prepare_grub(){
local platform=i386-pc img='core.img' grub=$3/boot/grub efi=$3/efi/boot \
lib=$1/usr/lib/grub prefix=/boot/grub theme=$2/usr/share/grub data=$1/usr/share/grub
lib=$1/usr/lib/grub prefix=/boot/grub theme=$2/usr/share/grub
prepare_dir ${grub}/${platform}
@@ -72,16 +79,8 @@ prepare_grub(){
cat ${grub}/${platform}/cdboot.img ${grub}/${platform}/${img} > ${grub}/${platform}/eltorito.img
case ${target_arch} in
'i686')
platform=i386-efi
img=bootia32.efi
;;
'x86_64')
platform=x86_64-efi
img=bootx64.efi
;;
esac
platform=x86_64-efi
img=bootx64.efi
prepare_dir ${efi}
prepare_dir ${grub}/${platform}
@@ -93,10 +92,17 @@ prepare_grub(){
grub-mkimage -d ${grub}/${platform} -o ${efi}/${img} -O ${platform} -p ${prefix} iso9660
prepare_dir ${grub}/themes
cp -r ${theme}/themes/${iso_name} ${grub}/themes/
cp ${data}/unicode.pf2 ${grub}
cp -r ${theme}/themes/artix ${grub}/themes/
cp -r ${theme}/{locales,tz} ${grub}
if [[ -f /usr/share/grub/unicode.pf2 ]];then
msg2 "Copying %s ..." "unicode.pf2"
cp /usr/share/grub/unicode.pf2 ${grub}/unicode.pf2
else
msg2 "Creating %s ..." "unicode.pf2"
grub-mkfont -o ${grub}/unicode.pf2 /usr/share/fonts/misc/unifont.bdf
fi
local size=4M mnt="${mnt_dir}/efiboot" efi_img="$3/efi.img"
msg2 "Creating fat image of %s ..." "${size}"
truncate -s ${size} "${efi_img}"

147
lib/iso/iso.sh Normal file
View File

@@ -0,0 +1,147 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
gen_iso_fn(){
local vars=("artix") name
vars+=("${PROFILE}")
vars+=("${INITSYS}")
case "${REPOSITORY}" in
'gremlins'|'goblins') vars+=("${REPOSITORY}") ;;
esac
vars+=("${ISO_VERSION}")
vars+=("${ARCH}")
for n in ${vars[@]};do
name=${name:-}${name:+-}${n}
done
echo $name
}
clean_iso_root(){
local dest="$1"
msg "Deleting isoroot [%s] ..." "${dest##*/}"
rm -rf --one-file-system "$dest"
}
make_sig () {
local idir="$1" file="$2"
msg2 "Creating signature file..."
cd "$idir"
user_own "$idir"
user_run "gpg --detach-sign --default-key ${GPG_KEY} $file.sfs"
chown -R root "$idir"
cd ${OLDPWD}
}
make_checksum(){
local idir="$1" file="$2"
msg2 "Creating sha512sum ..."
cd $idir
sha512sum $file.sfs > $file.sha512
cd ${OLDPWD}
}
# $1: image path
make_sfs() {
local src="$1"
if [[ ! -e "${src}" ]]; then
error "The path %s does not exist" "${src}"
retrun 1
fi
local timer=$(get_timer) dest=${iso_root}/artix/${ARCH}
local name=${1##*/}
local sfs="${dest}/${name}.sfs"
mkdir -p ${dest}
msg "Generating SquashFS image for %s" "${src}"
if [[ -f "${sfs}" ]]; then
local has_changed_dir=$(find ${src} -newer ${sfs})
msg2 "Possible changes for %s ..." "${src}" >> /tmp/buildiso.debug
msg2 "%s" "${has_changed_dir}" >> /tmp/buildiso.debug
if [[ -n "${has_changed_dir}" ]]; then
msg2 "SquashFS image %s is not up to date, rebuilding..." "${sfs}"
rm "${sfs}"
else
msg2 "SquashFS image %s is up to date, skipping." "${sfs}"
return
fi
fi
if ${persist};then
local size=32G
local mnt="${mnt_dir}/${name}"
msg2 "Creating ext4 image of %s ..." "${size}"
truncate -s ${size} "${src}.img"
local ext4_args=()
ext4_args+=(-O ^has_journal,^resize_inode -E lazy_itable_init=0 -m 0)
mkfs.ext4 ${ext4_args[@]} -F "${src}.img" &>/dev/null
tune2fs -c 0 -i 0 "${src}.img" &> /dev/null
mount_img "${work_dir}/${name}.img" "${mnt}"
msg2 "Copying %s ..." "${src}/"
cp -aT "${src}/" "${mnt}/"
umount_img "${mnt}"
fi
msg2 "Creating SquashFS image, this may take some time..."
local mksfs_args=()
if ${persist};then
mksfs_args+=(${work_dir}/${name}.img)
else
mksfs_args+=(${src})
fi
mksfs_args+=(${sfs} -noappend)
local highcomp="-b 256K -Xbcj x86" comp='xz'
mksfs_args+=(-comp ${comp} ${highcomp})
mksquashfs "${mksfs_args[@]}"
make_checksum "${dest}" "${name}"
${persist} && rm "${src}.img"
if [[ -n ${GPG_KEY} ]];then
make_sig "${dest}" "${name}"
fi
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
assemble_iso(){
msg "Creating ISO image..."
local mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g)
xorriso -as mkisofs \
--modification-date=${mod_date} \
--protective-msdos-label \
-volid "${iso_label}" \
-appid "$(get_osname) Live/Rescue CD" \
-publisher "$(get_osname) <$(get_disturl)>" \
-preparer "Prepared by artools/${0##*/}" \
-r -graft-points -no-pad \
--sort-weight 0 / \
--sort-weight 1 /boot \
--grub2-mbr ${iso_root}/boot/grub/i386-pc/boot_hybrid.img \
-partition_offset 16 \
-b boot/grub/i386-pc/eltorito.img \
-c boot.catalog \
-no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot \
-append_partition 2 0xef ${iso_root}/efi.img \
-e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \
-no-emul-boot \
-iso-level 3 \
-o ${iso_dir}/${iso_file} \
${iso_root}/
}

68
lib/iso/mount.sh Normal file
View File

@@ -0,0 +1,68 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
track_img() {
info "mount: [%s]" "$2"
mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}")
}
mount_img() {
IMG_ACTIVE_MOUNTS=()
mkdir -p "$2"
track_img "$1" "$2"
}
umount_img() {
if [[ -n ${IMG_ACTIVE_MOUNTS[@]} ]];then
info "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}"
umount "${IMG_ACTIVE_MOUNTS[@]}"
unset IMG_ACTIVE_MOUNTS
rm -r "$1"
fi
}
track_fs() {
info "overlayfs mount: [%s]" "$5"
mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}")
}
mount_overlay(){
FS_ACTIVE_MOUNTS=()
local lower= upper="$1" work="$2" pkglist="$3"
local fs=${upper##*/}
local rootfs="$work/rootfs" desktopfs="$work/desktopfs" livefs="$work/livefs"
mkdir -p "${mnt_dir}/work"
mkdir -p "$upper"
case $fs in
desktopfs) lower="$rootfs" ;;
livefs)
lower="$rootfs"
[[ -f $pkglist ]] && lower="$desktopfs":"$rootfs"
;;
bootfs)
lower="$livefs":"$rootfs"
[[ -f $pkglist ]] && lower="$livefs":"$desktopfs":"$rootfs"
;;
esac
track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper"
}
umount_overlay(){
if [[ -n ${FS_ACTIVE_MOUNTS[@]} ]];then
info "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}"
umount "${FS_ACTIVE_MOUNTS[@]}"
unset FS_ACTIVE_MOUNTS
rm -rf "${mnt_dir}/work"
fi
}

119
lib/iso/profile.sh Normal file
View File

@@ -0,0 +1,119 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
init_profile(){
local profdir="$1" prof="$2"
ROOT_LIST="$profdir/base/Packages-Root"
ROOT_OVERLAY="$profdir/base/root-overlay"
LIVE_LIST="$profdir/base/Packages-Live"
LIVE_OVERLAY="$profdir/base/live-overlay"
[[ -f "$profdir/$prof/Packages-Root" ]] && ROOT_LIST="$profdir/$prof/Packages-Root"
[[ -d "$profdir/$prof/root-overlay" ]] && ROOT_OVERLAY="$profdir/$prof/root-overlay"
[[ -f "$profdir/$prof/Packages-Desktop" ]] && DESKTOP_LIST="$profdir/$prof/Packages-Desktop"
[[ -d "$profdir/$prof/desktop-overlay" ]] && DESKTOP_OVERLAY="$profdir/$prof/desktop-overlay"
[[ -f "$profdir/$prof/Packages-Live" ]] && LIVE_LIST="$profdir/$prof/Packages-Live"
[[ -d "$profdir/$prof/live-overlay" ]] && LIVE_OVERLAY="$profdir/$prof/live-overlay"
}
show_profile(){
msg2 "iso_file: %s" "${iso_file}"
msg2 "AUTOLOGIN: %s" "${AUTOLOGIN}"
msg2 "HOST_NAME: %s" "${HOST_NAME}"
msg2 "USER_NAME: %s" "${USER_NAME}"
msg2 "PASSWORD: %s" "${PASSWORD}"
msg2 "ADDGROUPS: %s" "${ADDGROUPS}"
msg2 "SERVICES_LIVE: %s" "${SERVICES_LIVE[*]}"
msg2 "SERVICES: %s" "${SERVICES[*]}"
}
load_profile(){
local prof="$1"
local profdir="${DATADIR}/iso-profiles"
[[ -d ${WORKSPACE_DIR}/iso-profiles ]] && profdir=${WORKSPACE_DIR}/iso-profiles
init_profile "$profdir" "$prof"
[[ -f $profdir/$prof/profile.conf ]] || return 1
[[ -r $profdir/$prof/profile.conf ]] && . $profdir/$prof/profile.conf
DISPLAYMANAGER=${DISPLAYMANAGER:-'none'}
AUTOLOGIN=${AUTOLOGIN:-"true"}
[[ ${DISPLAYMANAGER} == 'none' ]] && AUTOLOGIN="false"
HOST_NAME=${HOST_NAME:-'artix'}
USER_NAME=${USER_NAME:-'artix'}
PASSWORD=${PASSWORD:-'artix'}
ADDGROUPS=${ADDGROUPS:-"video,power,optical,network,lp,scanner,wheel,users,log"}
if [[ -z ${SERVICES[@]} ]];then
SERVICES=('acpid' 'bluetooth' 'cronie' 'cupsd' 'syslog-ng' 'NetworkManager')
fi
if [[ ${DISPLAYMANAGER} != "none" ]];then
case "${INITSYS}" in
'openrc') SERVICES+=('xdm') ;;
'runit') SERVICES+=("${DISPLAYMANAGER}") ;;
esac
fi
if [[ -z ${SERVICES_LIVE[@]} ]];then
SERVICES_LIVE=('artix-live' 'pacman-init')
fi
return 0
}
write_live_session_conf(){
msg2 "Writing live.conf"
local conf=''
conf+=$(printf '%s\n' '# live session configuration')
conf+=$(printf "\nAUTOLOGIN=%s\n" "${AUTOLOGIN}")
conf+=$(printf "\nUSER_NAME=%s\n" "${USER_NAME}")
conf+=$(printf "\nPASSWORD=%s\n" "${PASSWORD}")
conf+=$(printf "\nADDGROUPS='%s'\n" "${ADDGROUPS}")
printf '%s' "$conf"
}
load_pkgs(){
local pkglist="$1" init="$2"
info "Loading Packages: [%s] ..." "${pkglist##*/}"
local _init="s|@$init||g"
case "$init" in
'openrc') _init_rm1="s|@runit.*||g"; _init_rm2="s|@s6*||g" ;;
's6') _init_rm1="s|@runit.*||g"; _init_rm2="s|@openrc.*||g" ;;
'runit') _init_rm1="s|@s6.*||g"; _init_rm2="s|@openrc.*||g" ;;
esac
local _space="s| ||g" \
_clean=':a;N;$!ba;s/\n/ /g' \
_com_rm="s|#.*||g"
packages=($(sed "$_com_rm" "$pkglist" \
| sed "$_space" \
| sed "$_purge" \
| sed "$_init" \
| sed "$_init_rm1" \
| sed "$_init_rm2" \
| sed "$_clean"))
}

282
lib/iso/util.sh Normal file
View File

@@ -0,0 +1,282 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
error_function() {
if [[ -p $logpipe ]]; then
rm "$logpipe"
fi
local func="$1"
# first exit all subshells, then print the error
if (( ! BASH_SUBSHELL )); then
error "A failure occurred in %s()." "$func"
plain "Aborting..."
fi
umount_overlay
umount_img
exit 2
}
# $1: function
run_log(){
local func="$1" log_dir='/var/log/artools'
[[ ! -d $log_dir ]] && mkdir -p $log_dir
local logfile=${log_dir}/$(gen_iso_fn).$func.log
logpipe=$(mktemp -u "/tmp/$func.pipe.XXXXXXXX")
mkfifo "$logpipe"
tee "$logfile" < "$logpipe" &
local teepid=$!
$func &> "$logpipe"
wait $teepid
rm "$logpipe"
}
run_safe() {
local restoretrap func="$1"
set -e
set -E
restoretrap=$(trap -p ERR)
trap 'error_function $func' ERR
if ${log};then
run_log "$func"
else
"$func"
fi
eval $restoretrap
set +E
set +e
}
trap_exit() {
local sig=$1; shift
error "$@"
umount_overlay
trap -- "$sig"
kill "-$sig" "$$"
}
prepare_traps(){
for sig in TERM HUP QUIT; do
trap "trap_exit $sig \"$(gettext "%s signal caught. Exiting...")\" \"$sig\"" "$sig"
done
trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT
# trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR
}
# Build ISO
make_iso() {
msg "Start [Build ISO]"
touch "${iso_root}/.artix"
for sfs_dir in $(find "${work_dir}" -maxdepth 1 -type d); do
if [[ "${sfs_dir}" != "${work_dir}" ]]; then
make_sfs "${sfs_dir}"
fi
done
msg "Making bootable image"
# Sanity checks
[[ ! -d "${iso_root}" ]] && return 1
if [[ -f "${iso_dir}/${iso_file}" ]]; then
msg2 "Removing existing bootable image..."
rm -rf "${iso_dir}/${iso_file}"
fi
assemble_iso
msg "Done [Build ISO]"
}
install_packages(){
local fs="$1"
setarch "${ARCH}" mkchroot \
"${mkchroot_args[@]}" "${fs}" "${packages[@]}"
}
copy_overlay(){
local src="$1" dest="$2"
if [[ -e "$src" ]];then
msg2 "Copying [%s] ..." "${src##*/}"
cp -LR "$src"/* "$dest"
fi
}
clean_up_image(){
local path mnt="$1"
msg2 "Cleaning [%s]" "${mnt##*/}"
if [[ -f "$mnt/etc/locale.gen.orig" ]];then
mv "$mnt/etc/locale.gen.orig" "$mnt/etc/locale.gen"
rm "$mnt/etc/locale.conf"
fi
path=$mnt/boot
if [[ -d "$path" ]]; then
find "$path" -name 'initramfs*.img' -delete &> /dev/null
fi
path=$mnt/var/lib/pacman/sync
if [[ -d $path ]];then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/cache/pacman/pkg
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/log
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
path=$mnt/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
if [[ ${mnt##*/} == 'livefs' ]];then
rm -rf "$mnt/etc/pacman.d/gnupg"
fi
find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete
if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then
rm $mnt/boot/grub/grub.cfg
fi
if [[ -f "$mnt/etc/machine-id" ]]; then
rm $mnt/etc/machine-id
fi
}
make_rootfs() {
if [[ ! -e ${work_dir}/rootfs.lock ]]; then
msg "Prepare [Base installation] (rootfs)"
local rootfs="${work_dir}/rootfs"
prepare_dir "${rootfs}"
install_packages "${rootfs}"
copy_overlay "${ROOT_OVERLAY}" "${rootfs}"
clean_up_image "${rootfs}"
msg "Done [Base installation] (rootfs)"
fi
}
make_desktopfs() {
if [[ ! -e ${work_dir}/desktopfs.lock ]]; then
msg "Prepare [Desktop installation] (desktopfs)"
local desktopfs="${work_dir}/desktopfs"
prepare_dir "${desktopfs}"
mount_overlay "${desktopfs}" "${work_dir}"
install_packages "${desktopfs}"
copy_overlay "${DESKTOP_OVERLAY}" "${desktopfs}"
umount_overlay
clean_up_image "${desktopfs}"
msg "Done [Desktop installation] (desktopfs)"
fi
}
make_livefs() {
if [[ ! -e ${work_dir}/livefs.lock ]]; then
msg "Prepare [Live installation] (livefs)"
local livefs="${work_dir}/livefs"
prepare_dir "${livefs}"
mount_overlay "${livefs}" "${work_dir}" "${DESKTOP_LIST}"
install_packages "${livefs}"
copy_overlay "${LIVE_OVERLAY}" "${livefs}"
configure_live_image "${livefs}"
umount_overlay
clean_up_image "${livefs}"
msg "Done [Live installation] (livefs)"
fi
}
make_bootfs() {
if [[ ! -e ${work_dir}/bootfs.lock ]]; then
msg "Prepare [/iso/boot]"
local boot="${iso_root}/boot"
prepare_dir "${boot}"
cp ${work_dir}/rootfs/boot/vmlinuz* ${boot}/vmlinuz-${ARCH}
local bootfs="${work_dir}/bootfs"
mount_overlay "${bootfs}" "${work_dir}" "${DESKTOP_LIST}"
prepare_initcpio "${bootfs}"
prepare_initramfs "${bootfs}"
cp ${bootfs}/boot/initramfs.img ${boot}/initramfs-${ARCH}.img
prepare_boot_extras "${bootfs}" "${boot}"
umount_overlay
rm -R ${bootfs}
: > ${work_dir}/bootfs.lock
msg "Done [/iso/boot]"
fi
}
make_grub(){
if [[ ! -e ${work_dir}/grub.lock ]]; then
msg "Prepare [/iso/boot/grub]"
prepare_grub "${work_dir}/rootfs" "${work_dir}/livefs" "${iso_root}"
configure_grub "${iso_root}"
: > ${work_dir}/grub.lock
msg "Done [/iso/boot/grub]"
fi
}
compress_images(){
local timer=$(get_timer)
run_safe "make_iso"
user_own "${iso_dir}" "-R"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
prepare_images(){
local timer=$(get_timer)
load_pkgs "${ROOT_LIST}" "${INITSYS}"
run_safe "make_rootfs"
if [[ -f "${DESKTOP_LIST}" ]] ; then
load_pkgs "${DESKTOP_LIST}" "${INITSYS}"
run_safe "make_desktopfs"
fi
if [[ -f ${LIVE_LIST} ]]; then
load_pkgs "${LIVE_LIST}" "${INITSYS}"
run_safe "make_livefs"
fi
run_safe "make_bootfs"
run_safe "make_grub"
show_elapsed_time "${FUNCNAME}" "${timer}"
}

62
lib/pkg/gitea.sh Normal file
View File

@@ -0,0 +1,62 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
create_repo(){
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
local json="{ \"auto_init\": true, \"name\":\"$gitname\", \"gitignores\":\"ArchLinuxPackages\", \"readme\": \"Default\" }"
msg2 "Create package repo [%s] in org (%s)" "${pkg}" "${org}"
curl -s -X POST "${GIT_URL}/api/v1/org/$org/repos?access_token=${GIT_TOKEN}" \
-H "accept: application/json" \
-H "content-type: application/json" \
-d "$json"
echo
}
delete_repo(){
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
msg2 "Delete package repo [%s] in org (%s)" "${pkg}" "${org}"
curl -s -X DELETE "${GIT_URL}/api/v1/repos/$org/$gitname?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}
load_team_id(){
local org="$1" team="$2" id=0
local ids=($(curl -s -X GET "${GIT_URL}/api/v1/orgs/$org/teams?access_token=${GIT_TOKEN}" \
-H "accept: application/json" | jshon -a -e id))
case $team in
packages) id="${ids[2]}" ;;
community) id="${ids[1]}" ;;
esac
echo $id
}
add_repo_to_team(){
local pkg="$1" org="$2" team="$3"
local id=$(load_team_id "$org" "$team")
msg2 "Adding package repo [%s] to team (%s)" "$pkg" "$team"
curl -s -X PUT "${GIT_URL}/api/v1/teams/$id/repos/$org/$pkg?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}

160
lib/pkg/subrepo.sh Normal file
View File

@@ -0,0 +1,160 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
get_local_head(){
echo $(git log --pretty=%H ...refs/heads/master^ | head -n 1)
}
get_remote_head(){
echo $(git ls-remote origin -h refs/heads/master | cut -f1)
}
get_pkg_org(){
local pkg="$1" org= sub=
case ${pkg} in
ruby-*) org="packagesRuby" ;;
perl-*) org="packagesPerl" ;;
python-*|python2-*) org="packagesPython" ;;
*) sub=${pkg:0:1}; org="packages${sub^^}" ;;
esac
echo $org
}
subrepo_push(){
local pkg="$1"
msg2 "Push (%s)" "$pkg"
git subrepo push "$pkg"
}
subrepo_clean(){
local pkg="$1"
msg2 "Clean (%s)" "$pkg"
git subrepo clean "$pkg"
}
subrepo_pull(){
local pkg="$1"
msg2 "Pull (%s)" "$pkg"
git subrepo pull "$pkg"
}
subrepo_clone(){
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
msg2 "Clone [%s] from (%s)" "$pkg" "$org/$gitname"
git subrepo clone gitea@"${GIT_DOMAIN}":"$org"/"$gitname".git "$pkg"
}
clone_tree(){
local timer=$(get_timer) url="$1" tree="$2" os="${3:-$(get_osname)}"
msg "Cloning %s (%s) ..." "$tree" "$os"
git clone $url/$tree.git
show_elapsed_time "${FUNCNAME}" "${timer}"
}
has_changes(){
local head_l="$1" head_r="$2"
if [[ "$head_l" == "$head_r" ]]; then
msg2 "remote changes: no"
return 1
else
msg2 "remote changes: yes"
return 0
fi
}
pull_tree(){
local tree="$1" local_head="$2" os="${3:-$(get_osname)}"
local remote_head=$(get_remote_head)
msg "Checking %s (%s)" "${tree}" "$os"
if $(has_changes "${local_head}" "${remote_head}");then
git pull origin master
fi
}
push_tree(){
local tree="$1"
msg "Update (%s)" "${tree}"
git push origin master
}
write_jenkinsfile(){
local pkg="$1"
local jenkins=$pkg/Jenkinsfile
echo "@Library('artix-ci') import org.artixlinux.RepoPackage" > $jenkins
echo '' >> $jenkins
echo 'PackagePipeline(new RepoPackage(this))' >> $jenkins
echo '' >> $jenkins
git add $jenkins
}
write_agentyaml(){
local pkg="$1"
local agent=$pkg/.artixlinux/agent.yaml label='master'
[[ -d $pkg/.artixlinux ]] || mkdir $pkg/.artixlinux
echo '%YAML 1.2' > $agent
echo '---' >> $agent
echo '' >> $agent
echo "label: $label" >> $agent
echo '' >> $agent
git add $agent
}
commit_jenkins_files(){
local pkg="$1"
write_jenkinsfile "$pkg"
write_agentyaml "$pkg"
git commit -m "add jenkinsfile & .artixlinux/agent.yaml"
}
config_tree(){
local tree="$1"
cd $tree
git config --bool pull.rebase true
git config commit.gpgsign true
if [[ -n "${GPGKEY}" ]];then
git config user.signingkey "${GPGKEY}"
else
warning "No GPGKEY configured in makepkg.conf!"
fi
cd ..
}
subrepo_new(){
local pkg="$1" tree="$2" team="${3:-$2}"
local dest=${TREE_DIR_ARTIX}/$tree/$pkg/trunk
cd ${TREE_DIR_ARTIX}/$tree
local org=$(get_pkg_org "$pkg")
create_repo "$pkg" "$org"
add_repo_to_team "$pkg" "$org" "$team"
subrepo_clone "$pkg" "$org"
prepare_dir "$dest"
commit_jenkins_files "$pkg"
}

235
lib/pkg/util.sh Normal file
View File

@@ -0,0 +1,235 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
get_compliant_name(){
local gitname="$1"
case $gitname in
*+) gitname=${gitname//+/plus}
esac
echo $gitname
}
patch_pkg(){
local pkg="$1"
case $pkg in
'glibc')
sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
-e '/nscd.service/d' \
-i $pkg/trunk/PKGBUILD
;;
'tp_smapi'|'acpi_call'|'r8168'|'bbswitch'|'broadcom-wl')
sed -e 's|-ARCH|-ARTIX|g' -i $pkg/trunk/PKGBUILD
;;
'nvidia')
sed -e 's|-ARCH|-ARTIX|g' -e 's|for Arch kernel|for Artix kernel|g' \
-e 's|for LTS Arch kernel|for LTS Artix kernel|g' \
-i $pkg/trunk/PKGBUILD
;;
'linux')
sed -e 's|-ARCH|-ARTIX|g' -i $pkg/trunk/PKGBUILD
sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
-e 's|CONFIG_CRYPTO_SPECK=.*|CONFIG_CRYPTO_SPECK=n|' \
-i $pkg/trunk/config
cd $pkg/trunk
updpkgsums
cd ../..
;;
'licenses')
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' -i $pkg/trunk/PKGBUILD
;;
'bash')
sed -e 's|system.bash_logout)|system.bash_logout artix.bashrc)|' \
-e "s|etc/bash.|etc/bash/|g" \
-e 's|"$pkgdir/etc/skel/.bash_logout"|"$pkgdir/etc/skel/.bash_logout"\n install -Dm644 artix.bashrc $pkgdir/etc/bash/bashrc.d/artix.bashrc|' \
-i $pkg/trunk/PKGBUILD
cd $pkg/trunk
patch -Np 1 -i ${DATADIR}/patches/artix-bash.patch
updpkgsums
cd ../..
;;
gstreamer|gst-plugins-*)
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
-e 's|(Arch Linux)|(Artix Linux)|' \
-i $pkg/trunk/PKGBUILD
;;
esac
}
arch2artix(){
local repo="$1" artix=none
case "$repo" in
core) artix=system ;;
extra) artix=world ;;
community) artix=galaxy ;;
multilib) artix=lib32 ;;
staging) artix=goblins ;;
testing) artix=gremlins ;;
community-staging) artix=galaxy-goblins ;;
community-testing) artix=galaxy-gremlins ;;
multilib-staging) artix=lib32-goblins ;;
multilib-testing) artix=lib32-gremlins ;;
kde-unstable) artix=kde-wobble ;;
gnome-unstable) artix=gnome-wobble ;;
esac
echo $artix
}
find_tree(){
local tree="$1" pkg="$2"
local result=$(find $tree -mindepth 2 -maxdepth 2 -type d -name "$pkg")
result=${result%/*}
echo ${result##*/}
}
arch_repos(){
local stag="$1" unst="$2"
local repos=(core extra testing community community-testing multilib multilib-testing)
$stag && repos+=(staging community-staging multilib-staging)
$unst && repos+=(gnome-unstable kde-unstable)
echo ${repos[@]}
}
find_repo(){
local pkg="$1" stag="$2" unst="$3" repo=
for r in $(arch_repos "$stag" "$unst");do
[[ -f $pkg/repos/$r-x86_64/PKGBUILD ]] && repo=$r-x86_64
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=$r-any
done
echo $repo
}
is_valid_repo(){
local src="$1" cases=
for r in $(arch_repos true true);do
cases=${cases:-}${cases:+|}${r}
done
eval "case $src in
${cases}|trunk) return 0 ;;
*) return 1 ;;
esac"
}
get_cases(){
local pkglist="${SYSCONFDIR}/pkglist.d/$1.list"
local _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g"
local pkgs=($(sed "$_com_rm" "$pkglist" | sed "$_space" | sed "$_clean"))
local cases=
for p in ${pkgs[@]};do
cases=${cases:-}${cases:+|}${p}
done
echo $cases
}
get_artix_tree(){
local pkg="$1" artix_tree="${2:-$3}" tree
eval "case $pkg in
$(get_cases kernel)) tree=packages-kernel ;;
$(get_cases python)) tree=packages-python ;;
$(get_cases perl)) tree=packages-perl ;;
$(get_cases ruby)) tree=packages-ruby ;;
$(get_cases openrc)) tree=packages-openrc ;;
$(get_cases runit)) tree=packages-runit ;;
$(get_cases media)) tree=packages-media ;;
$(get_cases xorg)) tree=packages-xorg ;;
$(get_cases qt5)) tree=packages-qt5 ;;
$(get_cases gtk)) tree=packages-gtk ;;
$(get_cases devel)) tree=packages-devel ;;
$(get_cases lxqt)) tree=packages-lxqt ;;
$(get_cases cinnamon)) tree=packages-cinnamon ;;
$(get_cases kde)) tree=packages-kde ;;
$(get_cases gnome)) tree=packages-gnome ;;
$(get_cases mate)) tree=packages-mate ;;
*) tree=$artix_tree
esac"
echo $tree
}
get_import_path(){
local pkg="$1" import_path=
for tree in ${TREE_NAMES_ARCH[@]};do
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg/repos ]] && import_path=${TREE_DIR_ARCH}/$tree/$pkg
done
echo $import_path
}
pkgver_equal() {
if [[ $1 = *-* && $2 = *-* ]]; then
# if both versions have a pkgrel, then they must be an exact match
[[ $1 = "$2" ]]
else
# otherwise, trim any pkgrel and compare the bare version.
[[ ${1%%-*} = "${2%%-*}" ]]
fi
}
find_cached_package() {
local searchdirs=("$PKGDEST" "$PWD") results=()
local targetname=$1 targetver=$2 targetarch=$3
local dir pkg pkgbasename name ver rel arch r results
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
for pkg in "$dir"/*.pkg.tar.?z; do
[[ -f $pkg ]] || continue
# avoid adding duplicates of the same inode
for r in "${results[@]}"; do
[[ $r -ef $pkg ]] && continue 2
done
# split apart package filename into parts
pkgbasename=${pkg##*/}
pkgbasename=${pkgbasename%.pkg.tar.?z}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
if [[ $targetname = "$name" && $targetarch = "$arch" ]] &&
pkgver_equal "$targetver" "$ver-$rel"; then
results+=("$pkg")
fi
done
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "${results[0]}"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
;;
esac
}

25
lib/util-base.sh.in Normal file
View File

@@ -0,0 +1,25 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
CHROOTVERSION=@chroot_version@
. @datadir@/makepkg/util.sh
DATADIR=${DATADIR:-'@datadir@/artools'}
LIBDIR=${LIBDIR:-'@libdir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
for baselib in ${LIBDIR}/base/*.sh; do
. $baselib
done

View File

@@ -1,90 +0,0 @@
#!/bin/bash
# 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; version 2 of the License.
#
# 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.
copy_mirrorlist(){
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
}
copy_keyring(){
if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then
cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/"
fi
}
create_min_fs(){
msg "Creating install root at %s" "$1"
mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,etc}
mkdir -m 1777 -p $1/{tmp,run}
mkdir -m 0555 -p $1/{sys,proc}
if [[ ! -f $1/etc/machine-id ]];then
touch $1/etc/machine-id
fi
}
is_btrfs() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]]
}
subvolume_delete_recursive() {
local subvol
is_btrfs "$1" || return 0
while IFS= read -d $'\0' -r subvol; do
if ! btrfs subvolume delete "$subvol" &>/dev/null; then
error "Unable to delete subvolume %s" "$subvol"
return 1
fi
done < <(find "$1" -xdev -depth -inum 256 -print0)
return 0
}
default_locale(){
local action="$1" mnt="$2"
if [[ $action == "set" ]];then
if [[ ! -f "$mnt/etc/locale.gen.bak" ]];then
info "Setting locale ..."
mv "$mnt/etc/locale.gen" "$mnt/etc/locale.gen.bak"
printf '%s.UTF-8 UTF-8\n' en_US > "$mnt/etc/locale.gen"
printf 'LANG=%s.UTF-8\n' en_US > "$mnt/etc/locale.conf"
printf 'LC_MESSAGES=C\n' >> "$mnt/etc/locale.conf"
fi
elif [[ $action == "reset" ]];then
if [[ -f "$mnt/etc/locale.gen.bak" ]];then
info "Resetting locale ..."
mv "$mnt/etc/locale.gen.bak" "$mnt/etc/locale.gen"
rm "$mnt/etc/locale.conf"
fi
fi
}
default_mirror(){
local mnt="$1" mirror="$2"'/$repo/os/$arch'
[[ -f $mnt/etc/pacman.d/mirrorlist ]] && mv "$mnt"/etc/pacman.d/mirrorlist "$mnt"/etc/pacman.d/mirrorlist.bak
echo "Server = $mirror" > $mnt/etc/pacman.d/mirrorlist
}
# $1: chroot
kill_chroot_process(){
local prefix="$1" flink pid name
for root_dir in /proc/*/root; do
flink=$(readlink $root_dir)
if [ "x$flink" != "x" ]; then
if [ "x${flink:0:${#prefix}}" = "x$prefix" ]; then
# this process is in the chroot...
pid=$(basename $(dirname "$root_dir"))
name=$(ps -p $pid -o comm=)
info "Killing chroot process: %s (%s)" "$name" "$pid"
kill -9 "$pid"
fi
fi
done
}

View File

@@ -1,111 +0,0 @@
#!/bin/bash
# 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; version 2 of the License.
#
# 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.
load_profile(){
local prof="$1"
local profdir="${DATADIR}/iso-profiles/$prof"
[[ "$prof" != 'base' ]] && profdir=${workspace_dir}/iso-profiles/$prof
root_list="${DATADIR}/iso-profiles/base/Packages-Root"
[[ -f "$profdir/Packages-Root" ]] && root_list="$profdir/Packages-Root"
root_overlay="${DATADIR}/iso-profiles/base/root-overlay"
[[ -d "$profdir/root-overlay" ]] && root_overlay="$profdir/root-overlay"
[[ -f "$profdir/Packages-Desktop" ]] && desktop_list="$profdir/Packages-Desktop"
[[ -d "$profdir/desktop-overlay" ]] && desktop_overlay="$profdir/desktop-overlay"
live_list="${DATADIR}/iso-profiles/base/Packages-Live"
[[ -f "$profdir/Packages-Live" ]] && live_list="$profdir/Packages-Live"
live_overlay="${DATADIR}/iso-profiles/base/live-overlay"
[[ -d "$profdir/live-overlay" ]] && live_overlay="$profdir/live-overlay"
[[ -f $profdir/profile.conf ]] || return 1
[[ -r $profdir/profile.conf ]] && source $profdir/profile.conf
[[ -z ${displaymanager} ]] && displaymanager="none"
[[ -z ${autologin} ]] && autologin="true"
[[ ${displaymanager} == 'none' ]] && autologin="false"
[[ -z ${hostname} ]] && hostname="artix"
[[ -z ${username} ]] && username="artix"
[[ -z ${password} ]] && password="artix"
if [[ -z ${addgroups} ]];then
addgroups="video,power,storage,optical,network,lp,scanner,wheel,users,audio"
fi
if [[ -z ${services[@]} ]];then
services=('acpid' 'bluetooth' 'cronie' 'cupsd' 'dbus' 'syslog-ng' 'NetworkManager')
fi
[[ ${displaymanager} != "none" ]] && services+=('xdm')
if [[ -z ${services_live[@]} ]];then
services_live=('artix-live' 'pacman-init')
fi
[[ -z ${netgroups_url} ]] && netgroups_url="https://raw.githubusercontent.com/artix-linux/netgroups/master"
return 0
}
write_live_session_conf(){
local path=$1${SYSCONFDIR}
[[ ! -d $path ]] && mkdir -p "$path"
local conf=$path/live.conf
msg2 "Writing %s" "${conf##*/}"
echo '# live session configuration' > ${conf}
echo '' >> ${conf}
echo '# autologin' >> ${conf}
echo "autologin=${autologin}" >> ${conf}
echo '' >> ${conf}
echo '# live username' >> ${conf}
echo "username=${username}" >> ${conf}
echo '' >> ${conf}
echo '# live password' >> ${conf}
echo "password=${password}" >> ${conf}
echo '' >> ${conf}
echo '# live group membership' >> ${conf}
echo "addgroups='${addgroups}'" >> ${conf}
}
load_pkgs(){
local pkglist="$1" init="$2" _kv="$3"
info "Loading Packages: [%s] ..." "${pkglist##*/}"
local _init="s|>$init||g"
case "$init" in
'openrc') _init_rm1="s|>runit.*||g"; _init_rm2="s|>s6*||g" ;;
's6') _init_rm1="s|>runit.*||g"; _init_rm2="s|>openrc.*||g" ;;
'runit') _init_rm1="s|>s6.*||g"; _init_rm2="s|>openrc.*||g" ;;
esac
local _blacklist="s|>blacklist.*||g" \
_kernel="s|KERNEL|$_kv|g" \
_space="s| ||g" \
_clean=':a;N;$!ba;s/\n/ /g' \
_com_rm="s|#.*||g"
packages=($(sed "$_com_rm" "$pkglist" \
| sed "$_space" \
| sed "$_blacklist" \
| sed "$_purge" \
| sed "$_init" \
| sed "$_init_rm1" \
| sed "$_init_rm2" \
| sed "$_kernel" \
| sed "$_clean"))
}

View File

@@ -1,51 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
connect(){
local home="/home/frs/project/${project}"
echo "${account},${project}@frs.${file_host}:${home}"
}
gen_webseed(){
local webseed seed="$1"
for mirror in ${host_mirrors[@]};do
webseed=${webseed:-}${webseed:+,}"https://${mirror}.dl.${seed}"
done
echo ${webseed}
}
make_torrent(){
find ${src_dir} -type f -name "*.torrent" -delete
if [[ -n $(find ${src_dir} -type f -name "*.iso") ]]; then
for iso in $(ls ${src_dir}/*.iso);do
local seed=${file_host}/project/${project}${target_dir}${iso##*/}
local mktorrent_args=(-c "${torrent_meta}" -p -l ${piece_size} -a ${tracker_url} -w $(gen_webseed ${seed}))
${verbose} && mktorrent_args+=(-v)
info "mktorrent_args: %s" "${mktorrent_args[@]}"
msg2 "Creating (%s) ..." "${iso##*/}.torrent"
mktorrent ${mktorrent_args[*]} -o ${iso}.torrent ${iso}
done
fi
}
prepare_transfer(){
target_dir="/iso/${profile}/"
src_dir="${iso_pool}/${profile}/"
${torrent} && make_torrent
}
sync_dir(){
msg "Start upload [%s] ..." "${profile}"
rsync "${rsync_args[@]}" ${src_dir} $(connect)${target_dir}
msg "Done upload [%s]" "${profile}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}

View File

@@ -1,104 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
write_bootloader_conf(){
local conf="$1/bootloader.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo '---' > "$conf"
echo "efiBootLoader: \"grub\"" >> "$conf"
echo "kernel: \"/vmlinuz-$kernel-${target_arch}\"" >> "$conf"
echo "img: \"/initramfs-$kernel-${target_arch}.img\"" >> "$conf"
echo "fallback: \"/initramfs-$kernel-${target_arch}-fallback.img\"" >> "$conf"
echo 'timeout: "10"' >> "$conf"
echo "kernelLine: \", with ${kernel}\"" >> "$conf"
echo "fallbackKernelLine: \", with ${kernel} (fallback initramfs)\"" >> "$conf"
echo 'grubInstall: "grub-install"' >> "$conf"
echo 'grubMkconfig: "grub-mkconfig"' >> "$conf"
echo 'grubCfg: "/boot/grub/grub.cfg"' >> "$conf"
echo '#efiBootloaderId: "dirname"' >> "$conf"
}
write_servicescfg_conf(){
local conf="$1/servicescfg.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo '---' > "$conf"
echo '' >> "$conf"
echo 'services:' >> "$conf"
echo ' enabled:' >> "$conf"
for s in ${services[@]};do
echo " - name: $s" >> "$conf"
echo ' runlevel: default' >> "$conf"
done
}
write_initcpio_conf(){
local conf="$1/initcpio.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo "kernel: ${kernel}" >> "$conf"
}
write_users_conf(){
local conf="$1/users.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo "defaultGroups:" >> "$conf"
local IFS=','
for g in ${addgroups[@]};do
echo " - $g" >> "$conf"
done
unset IFS
echo "autologinGroup: autologin" >> "$conf"
echo "doAutologin: false" >> "$conf"
echo "sudoersGroup: wheel" >> "$conf"
echo "setRootPassword: true" >> "$conf"
echo "doReusePassword: false" >> "$conf" # only used in old 'users' module
echo "availableShells: /bin/bash, /bin/zsh" >> "$conf" # only used in new 'users' module
echo "avatarFilePath: ~/.face" >> "$conf"
}
write_netinstall_conf(){
local conf="$1/netinstall.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo "groupsUrl: ${netgroups}" >> "$conf"
}
write_unpack_conf(){
local conf="$1/unpackfs.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo "unpack:" >> "$conf"
echo " - source: \"/run/${iso_name}/bootmnt/${iso_name}/${target_arch}/rootfs.sfs\"" >> "$conf"
echo " sourcefs: \"squashfs\"" >> "$conf"
echo " destination: \"\"" >> "$conf"
if [[ -f "${desktop_list}" ]] ; then
echo " - source: \"/run/${iso_name}/bootmnt/${iso_name}/${target_arch}/desktopfs.sfs\"" >> "$conf"
echo " sourcefs: \"squashfs\"" >> "$conf"
echo " destination: \"\"" >> "$conf"
fi
}
configure_calamares(){
local dest="$1" mods="$1/etc/calamares/modules"
if [[ -d $dest/etc/calamares/modules ]];then
info "Configuring [Calamares]"
write_netinstall_conf "$mods"
write_unpack_conf "$mods"
write_users_conf "$mods"
write_initcpio_conf "$mods"
case ${initsys} in
'openrc') write_servicescfg_conf "$mods" ;;
esac
write_bootloader_conf "$mods"
info "Done configuring [Calamares]"
fi
}

View File

@@ -1,538 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
import ${LIBDIR}/util-chroot.sh
import ${LIBDIR}/util-iso-grub.sh
import ${LIBDIR}/util-iso-yaml.sh
import ${LIBDIR}/util-iso-profile.sh
track_img() {
info "mount: [%s]" "$2"
mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}")
}
mount_img() {
IMG_ACTIVE_MOUNTS=()
mkdir -p "$2"
track_img "$1" "$2"
}
umount_img() {
if [[ -n ${IMG_ACTIVE_MOUNTS[@]} ]];then
info "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}"
umount "${IMG_ACTIVE_MOUNTS[@]}"
unset IMG_ACTIVE_MOUNTS
rm -r "$1"
fi
}
track_fs() {
info "overlayfs mount: [%s]" "$5"
mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}")
}
mount_overlay(){
FS_ACTIVE_MOUNTS=()
local lower= upper="$1" work="$2" pkglist="$3"
local fs=${upper##*/}
local rootfs="$work/rootfs" desktopfs="$work/desktopfs" livefs="$work/livefs"
mkdir -p "${mnt_dir}/work"
mkdir -p "$upper"
case $fs in
desktopfs) lower="$rootfs" ;;
livefs)
lower="$rootfs"
[[ -f $pkglist ]] && lower="$desktopfs":"$rootfs"
;;
bootfs)
lower="$livefs":"$rootfs"
[[ -f $pkglist ]] && lower="$livefs":"$desktopfs":"$rootfs"
;;
esac
track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper"
}
umount_overlay(){
if [[ -n ${FS_ACTIVE_MOUNTS[@]} ]];then
info "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}"
umount "${FS_ACTIVE_MOUNTS[@]}"
unset FS_ACTIVE_MOUNTS
rm -rf "${mnt_dir}/work"
fi
}
error_function() {
if [[ -p $logpipe ]]; then
rm "$logpipe"
fi
local func="$1"
# first exit all subshells, then print the error
if (( ! BASH_SUBSHELL )); then
error "A failure occurred in %s()." "$func"
plain "Aborting..."
fi
umount_overlay
umount_img
exit 2
}
# $1: function
run_log(){
local func="$1" log_dir='/var/log/artools'
local logfile=${log_dir}/$(gen_iso_fn).$func.log
logpipe=$(mktemp -u "/tmp/$func.pipe.XXXXXXXX")
mkfifo "$logpipe"
tee "$logfile" < "$logpipe" &
local teepid=$!
$func &> "$logpipe"
wait $teepid
rm "$logpipe"
}
run_safe() {
local restoretrap func="$1"
set -e
set -E
restoretrap=$(trap -p ERR)
trap 'error_function $func' ERR
if ${verbose};then
run_log "$func"
else
"$func"
fi
eval $restoretrap
set +E
set +e
}
trap_exit() {
local sig=$1; shift
error "$@"
umount_overlay
trap -- "$sig"
kill "-$sig" "$$"
}
prepare_traps(){
for sig in TERM HUP QUIT; do
trap "trap_exit $sig \"$(gettext "%s signal caught. Exiting...")\" \"$sig\"" "$sig"
done
trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT
# trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR
}
add_svc_rc(){
local mnt="$1" name="$2" rlvl="$3"
if [[ -f $mnt/etc/init.d/$name ]];then
msg2 "Setting %s ..." "$name"
chroot $mnt rc-update add $name $rlvl &>/dev/null
fi
}
set_xdm(){
if [[ -f $1/etc/conf.d/xdm ]];then
local conf='DISPLAYMANAGER="'${displaymanager}'"'
sed -i -e "s|^.*DISPLAYMANAGER=.*|${conf}|" $1/etc/conf.d/xdm
fi
}
configure_hosts(){
sed -e "s|localhost.localdomain|localhost.localdomain ${hostname}|" -i $1/etc/hosts
}
configure_logind(){
local conf=$1/etc/$2/logind.conf
if [[ -e $conf ]];then
msg2 "Configuring logind ..."
sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' "$conf"
fi
}
configure_services(){
local mnt="$1"
info "Configuring [%s]" "${initsys}"
case ${initsys} in
'openrc')
for svc in ${services[@]}; do
[[ $svc == "xdm" ]] && set_xdm "$mnt"
add_svc_rc "$mnt" "$svc" "default"
done
for svc in ${services_live[@]}; do
add_svc_rc "$mnt" "$svc" "default"
done
;;
esac
info "Done configuring [%s]" "${initsys}"
}
configure_system(){
local mnt="$1"
case ${initsys} in
'openrc')
configure_logind "$mnt" "elogind"
;;
esac
echo ${hostname} > $mnt/etc/hostname
}
clean_iso_root(){
local dest="$1"
msg "Deleting isoroot [%s] ..." "${dest##*/}"
rm -rf --one-file-system "$dest"
}
clean_up_image(){
local path mnt="$1"
msg2 "Cleaning [%s]" "${mnt##*/}"
default_locale "reset" "$mnt"
path=$mnt/boot
if [[ -d "$path" ]]; then
find "$path" -name 'initramfs*.img' -delete &> /dev/null
fi
path=$mnt/var/lib/pacman/sync
if [[ -d $path ]];then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/cache/pacman/pkg
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/log
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
path=$mnt/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
if [[ ${mnt##*/} == 'livefs' ]];then
rm -rf "$mnt/etc/pacman.d/gnupg"
fi
find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete
if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then
rm $mnt/boot/grub/grub.cfg
fi
if [[ -f "$mnt/etc/machine-id" ]]; then
rm $mnt/etc/machine-id
fi
}
configure_live_image(){
local fs="$1"
msg "Configuring [livefs]"
configure_hosts "$fs"
configure_system "$fs"
configure_services "$fs"
configure_calamares "$fs"
write_live_session_conf "$fs"
msg "Done configuring [livefs]"
}
make_sig () {
local idir="$1" file="$2"
msg2 "Creating signature file..."
cd "$idir"
user_own "$idir"
user_run "gpg --detach-sign --default-key ${gpgkey} $file.sfs"
chown -R root "$idir"
cd ${OLDPWD}
}
make_checksum(){
local idir="$1" file="$2"
msg2 "Creating sha512sum ..."
cd $idir
sha512sum $file.sfs > $file.sha512
cd ${OLDPWD}
}
# $1: image path
make_sfs() {
local src="$1"
if [[ ! -e "${src}" ]]; then
error "The path %s does not exist" "${src}"
retrun 1
fi
local timer=$(get_timer) dest=${iso_root}/${iso_name}/${target_arch}
local name=${1##*/}
local sfs="${dest}/${name}.sfs"
mkdir -p ${dest}
msg "Generating SquashFS image for %s" "${src}"
if [[ -f "${sfs}" ]]; then
local has_changed_dir=$(find ${src} -newer ${sfs})
msg2 "Possible changes for %s ..." "${src}" >> /tmp/buildiso.debug
msg2 "%s" "${has_changed_dir}" >> /tmp/buildiso.debug
if [[ -n "${has_changed_dir}" ]]; then
msg2 "SquashFS image %s is not up to date, rebuilding..." "${sfs}"
rm "${sfs}"
else
msg2 "SquashFS image %s is up to date, skipping." "${sfs}"
return
fi
fi
if ${persist};then
local size=32G
local mnt="${mnt_dir}/${name}"
msg2 "Creating ext4 image of %s ..." "${size}"
truncate -s ${size} "${src}.img"
local ext4_args=()
${verbose} && ext4_args+=(-q)
ext4_args+=(-O ^has_journal,^resize_inode -E lazy_itable_init=0 -m 0)
mkfs.ext4 ${ext4_args[@]} -F "${src}.img" &>/dev/null
tune2fs -c 0 -i 0 "${src}.img" &> /dev/null
mount_img "${work_dir}/${name}.img" "${mnt}"
msg2 "Copying %s ..." "${src}/"
cp -aT "${src}/" "${mnt}/"
umount_img "${mnt}"
fi
msg2 "Creating SquashFS image, this may take some time..."
local mksfs_args=()
if ${persist};then
mksfs_args+=(${work_dir}/${name}.img)
else
mksfs_args+=(${src})
fi
mksfs_args+=(${sfs} -noappend)
local highcomp="-b 256K -Xbcj x86" comp='xz'
mksfs_args+=(-comp ${comp} ${highcomp})
if ${verbose};then
mksquashfs "${mksfs_args[@]}" >/dev/null
else
mksquashfs "${mksfs_args[@]}"
fi
make_checksum "${dest}" "${name}"
${persist} && rm "${src}.img"
if [[ -n ${gpgkey} ]];then
make_sig "${dest}" "${name}"
fi
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
assemble_iso(){
msg "Creating ISO image..."
local mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g)
xorriso -as mkisofs \
--modification-date=${mod_date} \
--protective-msdos-label \
-volid "${iso_label}" \
-appid "$(get_osname) Live/Rescue CD" \
-publisher "$(get_osname) <$(get_disturl)>" \
-preparer "Prepared by artools/${0##*/}" \
-r -graft-points -no-pad \
--sort-weight 0 / \
--sort-weight 1 /boot \
--grub2-mbr ${iso_root}/boot/grub/i386-pc/boot_hybrid.img \
-partition_offset 16 \
-b boot/grub/i386-pc/eltorito.img \
-c boot.catalog \
-no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot \
-append_partition 2 0xef ${iso_root}/efi.img \
-e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \
-no-emul-boot \
-iso-level 3 \
-o ${iso_dir}/${iso_file} \
${iso_root}/
}
# Build ISO
make_iso() {
msg "Start [Build ISO]"
touch "${iso_root}/.artix"
for sfs_dir in $(find "${work_dir}" -maxdepth 1 -type d); do
if [[ "${sfs_dir}" != "${work_dir}" ]]; then
make_sfs "${sfs_dir}"
fi
done
msg "Making bootable image"
# Sanity checks
[[ ! -d "${iso_root}" ]] && return 1
if [[ -f "${iso_dir}/${iso_file}" ]]; then
msg2 "Removing existing bootable image..."
rm -rf "${iso_dir}/${iso_file}"
fi
assemble_iso
msg "Done [Build ISO]"
}
gen_iso_fn(){
local vars=() name
vars+=("${iso_name}")
vars+=("${profile}")
vars+=("${iso_version}")
vars+=("${target_arch}")
for n in ${vars[@]};do
name=${name:-}${name:+-}${n}
done
echo $name
}
install_packages(){
local fs="$1"
setarch "${target_arch}" mkchroot \
"${mkchroot_args[@]}" "${fs}" "${packages[@]}"
}
copy_overlay(){
local src="$1" dest="$2"
if [[ -e "$src" ]];then
msg2 "Copying [%s] ..." "${src##*/}"
cp -LR "$src"/* "$dest"
fi
}
make_rootfs() {
if [[ ! -e ${work_dir}/rootfs.lock ]]; then
msg "Prepare [Base installation] (rootfs)"
local rootfs="${work_dir}/rootfs"
prepare_dir "${rootfs}"
install_packages "${rootfs}"
copy_overlay "${root_overlay}" "${rootfs}"
clean_up_image "${rootfs}"
msg "Done [Base installation] (rootfs)"
fi
}
make_desktopfs() {
if [[ ! -e ${work_dir}/desktopfs.lock ]]; then
msg "Prepare [Desktop installation] (desktopfs)"
local desktopfs="${work_dir}/desktopfs"
prepare_dir "${desktopfs}"
mount_overlay "${desktopfs}" "${work_dir}"
install_packages "${desktopfs}"
copy_overlay "${desktop_overlay}" "${desktopfs}"
umount_overlay
clean_up_image "${desktopfs}"
msg "Done [Desktop installation] (desktopfs)"
fi
}
make_livefs() {
if [[ ! -e ${work_dir}/livefs.lock ]]; then
msg "Prepare [Live installation] (livefs)"
local livefs="${work_dir}/livefs"
prepare_dir "${livefs}"
mount_overlay "${livefs}" "${work_dir}" "${desktop_list}"
install_packages "${livefs}"
copy_overlay "${live_overlay}" "${livefs}"
configure_live_image "${livefs}"
pacman -Qr "${livefs}" > ${iso_dir}/$(gen_iso_fn)-pkgs.txt
umount_overlay
clean_up_image "${livefs}"
msg "Done [Live installation] (livefs)"
fi
}
make_bootfs() {
if [[ ! -e ${work_dir}/bootfs.lock ]]; then
msg "Prepare [/iso/boot]"
local boot="${iso_root}/boot"
prepare_dir "${boot}"
cp ${work_dir}/rootfs/boot/vmlinuz* ${boot}/vmlinuz-${target_arch}
local bootfs="${work_dir}/bootfs"
mount_overlay "${bootfs}" "${work_dir}" "${desktop_list}"
prepare_initcpio "${bootfs}"
prepare_initramfs "${bootfs}"
cp ${bootfs}/boot/initramfs.img ${boot}/initramfs-${target_arch}.img
prepare_boot_extras "${bootfs}" "${boot}"
umount_overlay
rm -R ${bootfs}
: > ${work_dir}/bootfs.lock
msg "Done [/iso/boot]"
fi
}
make_grub(){
if [[ ! -e ${work_dir}/grub.lock ]]; then
msg "Prepare [/iso/boot/grub]"
prepare_grub "${work_dir}/rootfs" "${work_dir}/livefs" "${iso_root}"
configure_grub "${iso_root}/boot/grub/kernels.cfg"
: > ${work_dir}/grub.lock
msg "Done [/iso/boot/grub]"
fi
}
compress_images(){
local timer=$(get_timer)
run_safe "make_iso"
user_own "${iso_dir}" "-R"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
prepare_images(){
local timer=$(get_timer)
load_pkgs "${root_list}" "${initsys}" "${kernel}"
run_safe "make_rootfs"
if [[ -f "${desktop_list}" ]] ; then
load_pkgs "${desktop_list}" "${initsys}" "${kernel}"
run_safe "make_desktopfs"
fi
if [[ -f ${live_list} ]]; then
load_pkgs "${live_list}" "${initsys}" "${kernel}"
run_safe "make_livefs"
fi
run_safe "make_bootfs"
run_safe "make_grub"
show_elapsed_time "${FUNCNAME}" "${timer}"
}

17
lib/util-iso.sh.in Normal file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
for isolib in ${LIBDIR}/iso/*.sh; do
. $isolib
done

View File

@@ -1,186 +0,0 @@
#!/bin/bash
# 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; version 2 of the License.
#
# 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.
ignore_error() {
"$@" 2>/dev/null
return 0
}
parse_fstab(){
echo $(perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^UUID=#;' $1/etc/fstab)
# perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^/dev#;' $1/etc/fstab
# perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^LABEL=#;' $1/etc/fstab
}
detect(){
local detected="$(os-prober | tr ' ' '_' | paste -s -d ' ')"
echo ${detected}
}
# $1: os-prober array
get_os_name(){
local str=$1
str="${str#*:}"
str="${str#*:}"
str="${str%:*}"
echo "$str"
}
get_chroot_arch(){
local elf=$(file $1/usr/bin/file)
elf=${elf//*executable,}
echo ${elf%%,*}
}
chroot_part_mount() {
info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}")
}
select_os(){
local os_list=( $(detect) ) count=${#os_list[@]}
if [[ ${count} > 1 ]];then
msg "Detected systems:"
local i=0
for os in ${os_list[@]};do
local last=${os##*:}
case $last in
'efi') count=$((count-1)) ;;
*) info "$i) $(get_os_name $os)"; i=$((i+1)) ;;
esac
done
i=0
msg "Select system to mount [0-%s] : " "$((count-1))"
read select
else
select=0
fi
local os_str=${os_list[$select]} type
type=$os_str
root=${os_str%%:*}
type=${type##*:}
if [[ "${type##*:}" == 'linux' ]];then
msg "Mounting (%s) [%s]" "$(get_os_name $os_str)" "$root"
chroot_mount_partitions "$1" "$root"
else
die "You can't mount %s!" "$select"
fi
}
chroot_mount_partitions(){
CHROOT_ACTIVE_PART_MOUNTS=()
CHROOT_ACTIVE_MOUNTS=()
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap 'trap_handler' EXIT
chroot_part_mount $2 $1
local mounts=$(parse_fstab "$1")
for entry in ${mounts[@]}; do
entry=${entry//UUID=}
local dev=${entry%:*} mp=${entry#*:}
case "${entry#*:}" in
'/'|'swap'|'none') continue ;;
*) chroot_part_mount "/dev/disk/by-uuid/${dev}" "$1${mp}" ;;
esac
done
local chroot_arch=$(get_chroot_arch $1)
[[ ${chroot_arch} == x86-64 ]] && chroot_arch=${chroot_arch/-/_}
case ${target_arch} in
i686)
if [[ ${chroot_arch} == x86_64 ]];then
die "You can't chroot from %s host into %s!" "${target_arch}" "${chroot_arch}"
fi
;;
esac
chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind &&
chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error chroot_mount_conditional "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
chroot_mount /etc/resolv.conf "$1/etc/resolv.conf" --bind
}
chroot_mount() {
#info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
}
chroot_mount_conditional() {
local cond=$1; shift
if eval "$cond"; then
chroot_mount "$@"
fi
}
chroot_api_efi_mount() {
CHROOT_ACTIVE_MOUNTS=()
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap 'chroot_api_efi_umount' EXIT
chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind &&
chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error chroot_mount_conditional "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
chroot_api_mount() {
CHROOT_ACTIVE_MOUNTS=()
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap 'chroot_api_umount' EXIT
chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind &&
chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
chroot_part_umount() {
info "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
unset CHROOT_ACTIVE_PART_MOUNTS
}
chroot_api_umount() {
#info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}"
unset CHROOT_ACTIVE_MOUNTS
}
chroot_api_efi_umount() {
#info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}"
unset CHROOT_ACTIVE_MOUNTS
}
trap_handler(){
chroot_api_umount
chroot_part_umount
}

View File

@@ -1,89 +0,0 @@
#!/bin/bash
#
# 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; version 2 of the License.
#
# 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.
# $1: sofile
# $2: soarch
process_sofile() {
# extract the library name: libfoo.so
local soname="${1%.so?(+(.+([0-9])))}".so
# extract the major version: 1
soversion="${1##*\.so\.}"
if [[ "$soversion" = "$1" ]] && (($IGNORE_INTERNAL)); then
continue
fi
if ! in_array "${soname}=${soversion}-$2" ${soobjects[@]}; then
# libfoo.so=1-64
msg "${soname}=${soversion}-$2"
soobjects+=("${soname}=${soversion}-$2")
fi
}
pkgver_equal() {
if [[ $1 = *-* && $2 = *-* ]]; then
# if both versions have a pkgrel, then they must be an exact match
[[ $1 = "$2" ]]
else
# otherwise, trim any pkgrel and compare the bare version.
[[ ${1%%-*} = "${2%%-*}" ]]
fi
}
find_cached_package() {
local searchdirs=("$PKGDEST" "$PWD") results=()
local targetname=$1 targetver=$2 targetarch=$3
local dir pkg pkgbasename name ver rel arch r results
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
for pkg in "$dir"/*.pkg.tar.?z; do
[[ -f $pkg ]] || continue
# avoid adding duplicates of the same inode
for r in "${results[@]}"; do
[[ $r -ef $pkg ]] && continue 2
done
# split apart package filename into parts
pkgbasename=${pkg##*/}
pkgbasename=${pkgbasename%.pkg.tar.?z}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
if [[ $targetname = "$name" && $targetarch = "$arch" ]] &&
pkgver_equal "$targetver" "$ver-$rel"; then
results+=("$pkg")
fi
done
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "${results[0]}"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
;;
esac
}

17
lib/util-pkg.sh.in Normal file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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; version 2 of the License.
#
# 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.
for pkglib in ${LIBDIR}/pkg/*.sh; do
. $pkglib
done

View File

@@ -1,195 +0,0 @@
#!/bin/bash
# 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; version 2 of the License.
#
# 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.
get_timer(){
echo $(date +%s)
}
# $1: start timer
elapsed_time(){
echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }')
}
show_elapsed_time(){
info "Time %s: %s minutes" "$1" "$(elapsed_time $2)"
}
load_vars() {
local var
[[ -f $1 ]] || return 1
for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER CARCH GPGKEY; do
[[ -z ${!var:-} ]] && eval "$(grep -a "^${var}=" "$1")"
done
return 0
}
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p $1
}
get_disturl(){
source /usr/lib/os-release
echo "${HOME_URL}"
}
get_osname(){
source /usr/lib/os-release
echo "${NAME}"
}
get_osid(){
source /usr/lib/os-release
echo "${ID}"
}
init_artools_base(){
target_arch=$(uname -m)
[[ -z ${chroots_dir} ]] && chroots_dir='/var/lib/artools'
[[ -z ${workspace_dir} ]] && workspace_dir=/home/${OWNER}/artools-workspace
prepare_dir "${workspace_dir}"
}
init_artools_pkg(){
[[ -z ${tree_dir_artix} ]] && tree_dir_artix=${workspace_dir}/artix
[[ -z ${host_tree_artix} ]] && host_tree_artix='https://github.com/artix-linux'
[[ -z ${tree_dir_arch} ]] && tree_dir_arch=${workspace_dir}/archlinux
[[ -z ${host_tree_arch} ]] && host_tree_arch='git://projects.archlinux.org/svntogit'
list_dir_import="${SYSCONFDIR}/import.list.d"
[[ -d ${AT_USERCONFDIR}/import.list.d ]] && list_dir_import=${AT_USERCONFDIR}/import.list.d
chroots_pkg="${chroots_dir}/buildpkg"
[[ -z ${patches_dir} ]] && patches_dir=${workspace_dir}/archlinux-patches
[[ -z ${repos_root} ]] && repos_root="${workspace_dir}/repos"
}
init_artools_iso(){
chroots_iso="${chroots_dir}/buildiso"
[[ -z ${iso_pool} ]] && iso_pool="${workspace_dir}/iso"
prepare_dir "${iso_pool}"
profile='base'
[[ -z ${iso_version} ]] && iso_version=$(date +%Y%m%d)
iso_name=$(get_osid)
iso_label="ARTIX_$(date +%Y%m)"
[[ -z ${initsys} ]] && initsys="openrc"
[[ -z ${kernel} ]] && kernel="linux-lts"
[[ -z ${kernel_args} ]] && kernel_args=""
[[ -z ${gpgkey} ]] && gpgkey=''
[[ -z ${uplimit} ]] && uplimit=100
[[ -z ${tracker_url} ]] && tracker_url='udp://mirror.strits.dk:6969'
[[ -z ${piece_size} ]] && piece_size=21
[[ -z ${file_host} ]] && file_host="sourceforge.net"
[[ -z ${project} ]] && project="artix-linux"
[[ -z ${account} ]] && account="[SetUser]"
[[ -z ${host_mirrors[@]} ]] && host_mirrors=('netcologne' 'freefr' 'netix' 'kent' '10gbps-io')
torrent_meta="$(get_osname)"
}
load_config(){
[[ -f $1 ]] || return 1
artools_conf="$1"
[[ -r ${artools_conf} ]] && source ${artools_conf}
init_artools_base
init_artools_pkg
init_artools_iso
return 0
}
user_own(){
local flag=$2
chown ${flag} "${OWNER}:$(id --group ${OWNER})" "$1"
}
user_run(){
su ${OWNER} -c "$@"
}
clean_dir(){
if [[ -d $1 ]]; then
msg "Cleaning [%s] ..." "$1"
rm -r $1/*
fi
}
load_user_info(){
OWNER=${SUDO_USER:-$USER}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
AT_USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
PAC_USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/pacman"
prepare_dir "${AT_USERCONFDIR}"
}
show_version(){
msg "artools"
msg2 "version: %s" "${version}"
}
show_config(){
if [[ -f ${AT_USERCONFDIR}/artools.conf ]]; then
msg2 "config: %s" "~/.config/artools/artools.conf"
else
msg2 "config: %s" "${artools_conf}"
fi
}
check_root() {
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo -- "${orig_argv[@]}"
else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
}