mirror of
https://github.com/ostreedev/ostree.git
synced 2024-12-23 21:35:26 +03:00
329a82c57e
I was trying to followup the `--selinux-policy-from-base` work to add a `cosa build --fast=overlay` for coreos-assembler, but hit on the fact that using e.g. `--owner-uid` disables commit optimizations. A while ago, https://github.com/ostreedev/ostree/pull/1643 landed which optimized this for the case where no modifications are provided. But, we really need the SELinux policy bits, and it's super convenient to run `ostree commit` as non-root. It's fairly surprising actually that it's taken us so long to iterate on a good interface for this "commit changes on top of a base" model. In practice, many nontrivial cases really end up needing to do a (hardlink) checkout, and that case is optimized. But for this coreos-assembler work I want to directly overlay onto a commit object another commit object. That previous PR above added exactly the API we need, so let's expose it in the CLI. What you can see happening in the test is that we provide `--owner-uid 42`, but that only applies to directories/files that were added in the commit. And now that I look at this, I think what we really want here is to avoid changing directories that exist in the base, but eh; in practice the main use here is for `--owner-uid 0` while committing as non-root; and that works fine with this since the baseline uid will be zero as well.
79 lines
2.3 KiB
Bash
79 lines
2.3 KiB
Bash
# This file is to be sourced, not executed
|
|
|
|
# Copyright (C) 2011 Colin Walters <walters@verbum.org>
|
|
#
|
|
# SPDX-License-Identifier: LGPL-2.0+
|
|
#
|
|
# This library is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public
|
|
# License as published by the Free Software Foundation; either
|
|
# version 2 of the License, or (at your option) any later version.
|
|
#
|
|
# This library 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
|
|
# Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public
|
|
# License along with this library; if not, write to the
|
|
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
# Boston, MA 02111-1307, USA.
|
|
|
|
set -euo pipefail
|
|
|
|
$OSTREE checkout test2 checkout-test2
|
|
echo "ok checkout"
|
|
|
|
cd checkout-test2
|
|
assert_has_file firstfile
|
|
assert_has_file baz/cow
|
|
assert_file_has_content baz/cow moo
|
|
assert_has_file baz/deeper/ohyeah
|
|
echo "ok content"
|
|
|
|
cd ${test_tmpdir}
|
|
mkdir repo2
|
|
ostree_repo_init repo2
|
|
${CMD_PREFIX} ostree --repo=repo2 pull-local repo
|
|
echo "ok local clone"
|
|
|
|
cd ${test_tmpdir}
|
|
${CMD_PREFIX} ostree --repo=repo2 checkout test2 test2-checkout-from-local-clone
|
|
cd test2-checkout-from-local-clone
|
|
assert_file_has_content baz/cow moo
|
|
cd ${test_tmpdir}
|
|
rm repo2 -rf
|
|
echo "ok local clone checkout"
|
|
|
|
$OSTREE checkout -U test2 checkout-user-test2
|
|
echo "ok user checkout"
|
|
|
|
cd ${test_tmpdir}/checkout-test2
|
|
$OSTREE commit -b test2-uid0 -s 'UID 0 test' --owner-uid=0 --owner-gid=0
|
|
echo "ok uid0 commit"
|
|
|
|
cd ${test_tmpdir}
|
|
$OSTREE ls test2-uid0 /firstfile > uid0-ls-output.txt
|
|
assert_file_has_content uid0-ls-output.txt "-006[64]4 0 0 6 /firstfile"
|
|
echo "ok uid0 ls"
|
|
|
|
$OSTREE checkout -U test2-uid0 checkout-user-test2-uid0
|
|
echo "ok user checkout from uid 0"
|
|
|
|
cd ${test_tmpdir}
|
|
$OSTREE cat test2 /baz/cow > cow-contents
|
|
assert_file_has_content cow-contents "moo"
|
|
echo "ok cat-file"
|
|
|
|
cd ${test_tmpdir}
|
|
$OSTREE fsck
|
|
echo "ok fsck"
|
|
|
|
mkdir -p test-overlays
|
|
date > test-overlays/overlaid-file
|
|
$OSTREE commit ${COMMIT_ARGS} -b test-base --base test2 --owner-uid 42 --owner-gid 42 test-overlays/
|
|
$OSTREE ls -R test-base > ls.txt
|
|
assert_streq "$(wc -l < ls.txt)" 14
|
|
assert_streq "$(grep '42.*42' ls.txt | wc -l)" 2
|
|
echo "ok commit overlay base"
|