New upstream version 2017.11
This commit is contained in:
commit
573491dc3d
|
|
@ -19,3 +19,6 @@
|
||||||
|
|
||||||
completionsdir = @BASH_COMPLETIONSDIR@
|
completionsdir = @BASH_COMPLETIONSDIR@
|
||||||
dist_completions_DATA = bash/ostree
|
dist_completions_DATA = bash/ostree
|
||||||
|
|
||||||
|
# Allow the distcheck install under $prefix test to pass
|
||||||
|
AM_DISTCHECK_CONFIGURE_FLAGS += BASH_COMPLETIONSDIR='$${datadir}/bash-completion/completions'
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@ endif
|
||||||
if BUILDOPT_SYSTEMD
|
if BUILDOPT_SYSTEMD
|
||||||
systemdsystemunit_DATA = src/boot/ostree-prepare-root.service \
|
systemdsystemunit_DATA = src/boot/ostree-prepare-root.service \
|
||||||
src/boot/ostree-remount.service
|
src/boot/ostree-remount.service
|
||||||
|
systemdtmpfilesdir = $(prefix)/lib/tmpfiles.d
|
||||||
|
dist_systemdtmpfiles_DATA = src/boot/ostree-tmpfiles.conf
|
||||||
|
|
||||||
# Allow the distcheck install under $prefix test to pass
|
# Allow the distcheck install under $prefix test to pass
|
||||||
AM_DISTCHECK_CONFIGURE_FLAGS += --with-systemdsystemunitdir='$${libdir}/systemd/system'
|
AM_DISTCHECK_CONFIGURE_FLAGS += --with-systemdsystemunitdir='$${libdir}/systemd/system'
|
||||||
|
|
|
||||||
|
|
@ -68,4 +68,7 @@ ostree_system_generator_SOURCES = src/switchroot/ostree-mount-util.h \
|
||||||
ostree_system_generator_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/libglnx -I$(srcdir)/src/libostree
|
ostree_system_generator_CPPFLAGS = $(AM_CPPFLAGS) -I$(srcdir)/libglnx -I$(srcdir)/src/libostree
|
||||||
ostree_system_generator_CFLAGS = $(AM_CFLAGS) $(OT_INTERNAL_GIO_UNIX_CFLAGS)
|
ostree_system_generator_CFLAGS = $(AM_CFLAGS) $(OT_INTERNAL_GIO_UNIX_CFLAGS)
|
||||||
ostree_system_generator_LDADD = $(AM_LDFLAGS) libglnx.la libostree-1.la $(OT_INTERNAL_GIO_UNIX_LIBS)
|
ostree_system_generator_LDADD = $(AM_LDFLAGS) libglnx.la libostree-1.la $(OT_INTERNAL_GIO_UNIX_LIBS)
|
||||||
|
|
||||||
|
# Allow the distcheck install under $prefix test to pass
|
||||||
|
AM_DISTCHECK_CONFIGURE_FLAGS += --with-systemdsystemgeneratordir='$${libdir}/systemd/system-generators'
|
||||||
endif
|
endif
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,7 @@ endif
|
||||||
|
|
||||||
js_installed_tests = \
|
js_installed_tests = \
|
||||||
tests/test-core.js \
|
tests/test-core.js \
|
||||||
|
tests/test-remotes-config-dir.js \
|
||||||
tests/test-sizes.js \
|
tests/test-sizes.js \
|
||||||
tests/test-sysroot.js \
|
tests/test-sysroot.js \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
|
||||||
166
Makefile.in
166
Makefile.in
|
|
@ -493,41 +493,44 @@ check_PROGRAMS = $(am__EXEEXT_11) $(am__EXEEXT_12) $(am__EXEEXT_13)
|
||||||
@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_59 = -DHAVE_SYSTEMD_AND_LIBMOUNT=1
|
@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_59 = -DHAVE_SYSTEMD_AND_LIBMOUNT=1
|
||||||
@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@systemdsystemgenerator_PROGRAMS = ostree-system-generator$(EXEEXT)
|
@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@systemdsystemgenerator_PROGRAMS = ostree-system-generator$(EXEEXT)
|
||||||
@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_60 = $(systemdsystemgenerator_PROGRAMS)
|
@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_60 = $(systemdsystemgenerator_PROGRAMS)
|
||||||
@BUILDOPT_FUSE_TRUE@am__append_61 = rofiles-fuse
|
|
||||||
@BUILDOPT_ASAN_TRUE@am__append_62 = OT_SKIP_READDIR_RAND=1 G_SLICE=always-malloc
|
# Allow the distcheck install under $prefix test to pass
|
||||||
@ENABLE_EXPERIMENTAL_API_TRUE@am__append_63 = $(experimental_test_scripts)
|
@BUILDOPT_SYSTEMD_AND_LIBMOUNT_TRUE@am__append_61 = --with-systemdsystemgeneratordir='$${libdir}/systemd/system-generators'
|
||||||
@ENABLE_EXPERIMENTAL_API_FALSE@am__append_64 = $(experimental_test_scripts)
|
@BUILDOPT_FUSE_TRUE@am__append_62 = rofiles-fuse
|
||||||
@BUILDOPT_FUSE_TRUE@am__append_65 = tests/test-rofiles-fuse.sh
|
@BUILDOPT_ASAN_TRUE@am__append_63 = OT_SKIP_READDIR_RAND=1 G_SLICE=always-malloc
|
||||||
@BUILDOPT_FUSE_FALSE@am__append_66 = tests/test-rofiles-fuse.sh
|
@ENABLE_EXPERIMENTAL_API_TRUE@am__append_64 = $(experimental_test_scripts)
|
||||||
@USE_LIBSOUP_TRUE@am__append_67 = tests/test-remote-cookies.sh
|
@ENABLE_EXPERIMENTAL_API_FALSE@am__append_65 = $(experimental_test_scripts)
|
||||||
@BUILDOPT_GJS_TRUE@am__append_68 = $(js_tests) $(js_installed_tests)
|
@BUILDOPT_FUSE_TRUE@am__append_66 = tests/test-rofiles-fuse.sh
|
||||||
@BUILDOPT_GJS_FALSE@am__append_69 = $(js_tests)
|
@BUILDOPT_FUSE_FALSE@am__append_67 = tests/test-rofiles-fuse.sh
|
||||||
@BUILDOPT_GJS_FALSE@am__append_70 = $(js_installed_tests)
|
@USE_LIBSOUP_TRUE@am__append_68 = tests/test-remote-cookies.sh
|
||||||
@ENABLE_INSTALLED_TESTS_FALSE@am__append_71 = -rpath $(abs_builddir)
|
@BUILDOPT_GJS_TRUE@am__append_69 = $(js_tests) $(js_installed_tests)
|
||||||
@ENABLE_EXPERIMENTAL_API_TRUE@am__append_72 = \
|
@BUILDOPT_GJS_FALSE@am__append_70 = $(js_tests)
|
||||||
|
@BUILDOPT_GJS_FALSE@am__append_71 = $(js_installed_tests)
|
||||||
|
@ENABLE_INSTALLED_TESTS_FALSE@am__append_72 = -rpath $(abs_builddir)
|
||||||
|
@ENABLE_EXPERIMENTAL_API_TRUE@am__append_73 = \
|
||||||
@ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-bloom \
|
@ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-bloom \
|
||||||
@ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-repo-finder-config \
|
@ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-repo-finder-config \
|
||||||
@ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-repo-finder-mount \
|
@ENABLE_EXPERIMENTAL_API_TRUE@ tests/test-repo-finder-mount \
|
||||||
@ENABLE_EXPERIMENTAL_API_TRUE@ $(NULL)
|
@ENABLE_EXPERIMENTAL_API_TRUE@ $(NULL)
|
||||||
|
|
||||||
@ENABLE_EXPERIMENTAL_API_TRUE@@USE_AVAHI_TRUE@am__append_73 = tests/test-repo-finder-avahi
|
@ENABLE_EXPERIMENTAL_API_TRUE@@USE_AVAHI_TRUE@am__append_74 = tests/test-repo-finder-avahi
|
||||||
@USE_LIBARCHIVE_TRUE@am__append_74 = tests/test-libarchive-import
|
@USE_LIBARCHIVE_TRUE@am__append_75 = tests/test-libarchive-import
|
||||||
@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__append_75 = $(_installed_or_uninstalled_test_scripts)
|
@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__append_76 = $(_installed_or_uninstalled_test_scripts)
|
||||||
@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__append_76 = $(_installed_or_uninstalled_test_programs)
|
@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__append_77 = $(_installed_or_uninstalled_test_programs)
|
||||||
@ENABLE_INSTALLED_TESTS_TRUE@am__append_77 = install-installed-tests-extra
|
@ENABLE_INSTALLED_TESTS_TRUE@am__append_78 = install-installed-tests-extra
|
||||||
|
|
||||||
# Allow the distcheck install under $prefix test to pass
|
# Allow the distcheck install under $prefix test to pass
|
||||||
@BUILDOPT_SYSTEMD_TRUE@am__append_78 = --with-systemdsystemunitdir='$${libdir}/systemd/system'
|
@BUILDOPT_SYSTEMD_TRUE@am__append_79 = --with-systemdsystemunitdir='$${libdir}/systemd/system'
|
||||||
|
|
||||||
# We're using the system grub2-mkconfig generator
|
# We're using the system grub2-mkconfig generator
|
||||||
@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@am__append_79 = src/boot/grub2/grub2-15_ostree
|
@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@am__append_80 = src/boot/grub2/grub2-15_ostree
|
||||||
@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@am__append_80 = install-grub2-config-hook
|
@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@am__append_81 = install-grub2-config-hook
|
||||||
@BUILDOPT_TRIVIAL_HTTPD_TRUE@@ENABLE_MAN_TRUE@am__append_81 = ostree-trivial-httpd.1
|
@BUILDOPT_TRIVIAL_HTTPD_TRUE@@ENABLE_MAN_TRUE@am__append_82 = ostree-trivial-httpd.1
|
||||||
# We still want to distribute the source, even if we are not building it
|
# We still want to distribute the source, even if we are not building it
|
||||||
@BUILDOPT_TRIVIAL_HTTPD_FALSE@@ENABLE_MAN_TRUE@am__append_82 = man/ostree-trivial-httpd.xml
|
@BUILDOPT_TRIVIAL_HTTPD_FALSE@@ENABLE_MAN_TRUE@am__append_83 = man/ostree-trivial-httpd.xml
|
||||||
@BUILDOPT_FUSE_TRUE@@ENABLE_MAN_TRUE@am__append_83 = rofiles-fuse.1
|
@BUILDOPT_FUSE_TRUE@@ENABLE_MAN_TRUE@am__append_84 = rofiles-fuse.1
|
||||||
@ENABLE_MAN_TRUE@am__append_84 = $(man1_MANS:.1=.xml) $(man5_MANS:.5=.xml)
|
@ENABLE_MAN_TRUE@am__append_85 = $(man1_MANS:.1=.xml) $(man5_MANS:.5=.xml)
|
||||||
@ENABLE_MAN_TRUE@am__append_85 = \
|
@ENABLE_MAN_TRUE@am__append_86 = \
|
||||||
@ENABLE_MAN_TRUE@ $(man1_MANS) \
|
@ENABLE_MAN_TRUE@ $(man1_MANS) \
|
||||||
@ENABLE_MAN_TRUE@ $(man5_MANS) \
|
@ENABLE_MAN_TRUE@ $(man5_MANS) \
|
||||||
@ENABLE_MAN_TRUE@ $(NULL)
|
@ENABLE_MAN_TRUE@ $(NULL)
|
||||||
|
|
@ -551,6 +554,7 @@ DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
||||||
$(am__dist_gpginsttest_DATA_DIST) \
|
$(am__dist_gpginsttest_DATA_DIST) \
|
||||||
$(am__dist_gpginsttest_trusted_DATA_DIST) \
|
$(am__dist_gpginsttest_trusted_DATA_DIST) \
|
||||||
$(am__dist_gpgvinsttest_DATA_DIST) \
|
$(am__dist_gpgvinsttest_DATA_DIST) \
|
||||||
|
$(am__dist_systemdtmpfiles_DATA_DIST) \
|
||||||
$(am__libostreeinclude_HEADERS_DIST) $(am__DIST_COMMON)
|
$(am__libostreeinclude_HEADERS_DIST) $(am__DIST_COMMON)
|
||||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
configure.lineno config.status.lineno
|
configure.lineno config.status.lineno
|
||||||
|
|
@ -598,7 +602,8 @@ am__installdirs = "$(DESTDIR)$(installed_testdir)" \
|
||||||
"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" \
|
"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" \
|
||||||
"$(DESTDIR)$(completionsdir)" "$(DESTDIR)$(gpginsttestdir)" \
|
"$(DESTDIR)$(completionsdir)" "$(DESTDIR)$(gpginsttestdir)" \
|
||||||
"$(DESTDIR)$(gpginsttest_trusteddir)" \
|
"$(DESTDIR)$(gpginsttest_trusteddir)" \
|
||||||
"$(DESTDIR)$(gpgvinsttestdir)" "$(DESTDIR)$(dracutconfdir)" \
|
"$(DESTDIR)$(gpgvinsttestdir)" \
|
||||||
|
"$(DESTDIR)$(systemdtmpfilesdir)" "$(DESTDIR)$(dracutconfdir)" \
|
||||||
"$(DESTDIR)$(girdir)" "$(DESTDIR)$(gpgreadmedir)" \
|
"$(DESTDIR)$(girdir)" "$(DESTDIR)$(gpgreadmedir)" \
|
||||||
"$(DESTDIR)$(installed_testdir)" \
|
"$(DESTDIR)$(installed_testdir)" \
|
||||||
"$(DESTDIR)$(installed_test_metadir)" \
|
"$(DESTDIR)$(installed_test_metadir)" \
|
||||||
|
|
@ -1415,13 +1420,14 @@ am__dist_gpginsttest_trusted_DATA_DIST = \
|
||||||
tests/gpghome/trusted/pubring.gpg
|
tests/gpghome/trusted/pubring.gpg
|
||||||
am__dist_gpgvinsttest_DATA_DIST = $(addprefix tests/gpg-verify-data/, \
|
am__dist_gpgvinsttest_DATA_DIST = $(addprefix tests/gpg-verify-data/, \
|
||||||
gpg.conf lgpl2 lgpl2.sig pubring.gpg secring.gpg trustdb.gpg)
|
gpg.conf lgpl2 lgpl2.sig pubring.gpg secring.gpg trustdb.gpg)
|
||||||
|
am__dist_systemdtmpfiles_DATA_DIST = src/boot/ostree-tmpfiles.conf
|
||||||
DATA = $(dist_completions_DATA) $(dist_gpginsttest_DATA) \
|
DATA = $(dist_completions_DATA) $(dist_gpginsttest_DATA) \
|
||||||
$(dist_gpginsttest_trusted_DATA) $(dist_gpgvinsttest_DATA) \
|
$(dist_gpginsttest_trusted_DATA) $(dist_gpgvinsttest_DATA) \
|
||||||
$(dracutconf_DATA) $(gir_DATA) $(gpgreadme_DATA) \
|
$(dist_systemdtmpfiles_DATA) $(dracutconf_DATA) $(gir_DATA) \
|
||||||
$(installed_test_DATA) $(installed_test_meta_DATA) \
|
$(gpgreadme_DATA) $(installed_test_DATA) \
|
||||||
$(mkinitcpioconf_DATA) $(nobase_installed_test_DATA) \
|
$(installed_test_meta_DATA) $(mkinitcpioconf_DATA) \
|
||||||
$(noinst_DATA) $(pkgconfig_DATA) $(systemdsystemunit_DATA) \
|
$(nobase_installed_test_DATA) $(noinst_DATA) $(pkgconfig_DATA) \
|
||||||
$(typelib_DATA)
|
$(systemdsystemunit_DATA) $(typelib_DATA)
|
||||||
am__libostreeinclude_HEADERS_DIST = src/libostree/ostree.h \
|
am__libostreeinclude_HEADERS_DIST = src/libostree/ostree.h \
|
||||||
src/libostree/ostree-async-progress.h \
|
src/libostree/ostree-async-progress.h \
|
||||||
src/libostree/ostree-autocleanups.h \
|
src/libostree/ostree-autocleanups.h \
|
||||||
|
|
@ -1635,8 +1641,8 @@ am__EXEEXT_19 = tests/test-find-remotes.sh \
|
||||||
tests/test-summary-collections.sh \
|
tests/test-summary-collections.sh \
|
||||||
tests/test-pull-collections.sh $(am__EXEEXT_2)
|
tests/test-pull-collections.sh $(am__EXEEXT_2)
|
||||||
@ENABLE_EXPERIMENTAL_API_TRUE@am__EXEEXT_20 = $(am__EXEEXT_19)
|
@ENABLE_EXPERIMENTAL_API_TRUE@am__EXEEXT_20 = $(am__EXEEXT_19)
|
||||||
am__EXEEXT_21 = tests/test-core.js tests/test-sizes.js \
|
am__EXEEXT_21 = tests/test-core.js tests/test-remotes-config-dir.js \
|
||||||
tests/test-sysroot.js $(am__EXEEXT_2)
|
tests/test-sizes.js tests/test-sysroot.js $(am__EXEEXT_2)
|
||||||
@BUILDOPT_GJS_TRUE@am__EXEEXT_22 = $(js_tests) $(am__EXEEXT_21)
|
@BUILDOPT_GJS_TRUE@am__EXEEXT_22 = $(js_tests) $(am__EXEEXT_21)
|
||||||
am__EXEEXT_23 = tests/test-basic.sh tests/test-basic-user.sh \
|
am__EXEEXT_23 = tests/test-basic.sh tests/test-basic-user.sh \
|
||||||
tests/test-basic-user-only.sh tests/test-basic-root.sh \
|
tests/test-basic-user-only.sh tests/test-basic-root.sh \
|
||||||
|
|
@ -1675,7 +1681,7 @@ am__EXEEXT_23 = tests/test-basic.sh tests/test-basic-user.sh \
|
||||||
tests/test-switchroot.sh tests/test-pull-contenturl.sh \
|
tests/test-switchroot.sh tests/test-pull-contenturl.sh \
|
||||||
tests/test-pull-mirrorlist.sh tests/test-summary-update.sh \
|
tests/test-pull-mirrorlist.sh tests/test-summary-update.sh \
|
||||||
tests/test-summary-view.sh $(am__EXEEXT_2) $(am__EXEEXT_20) \
|
tests/test-summary-view.sh $(am__EXEEXT_2) $(am__EXEEXT_20) \
|
||||||
$(am__append_65) $(am__append_67) $(am__EXEEXT_22)
|
$(am__append_66) $(am__append_68) $(am__EXEEXT_22)
|
||||||
@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__EXEEXT_24 = \
|
@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@am__EXEEXT_24 = \
|
||||||
@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@ $(am__EXEEXT_23)
|
@ENABLE_INSTALLED_TESTS_EXCLUSIVE_FALSE@ $(am__EXEEXT_23)
|
||||||
am__EXEEXT_25 = $(am__EXEEXT_2) $(am__EXEEXT_24)
|
am__EXEEXT_25 = $(am__EXEEXT_2) $(am__EXEEXT_24)
|
||||||
|
|
@ -1967,8 +1973,12 @@ AM_CPPFLAGS = -DDATADIR='"$(datadir)"' -DLIBEXECDIR='"$(libexecdir)"' \
|
||||||
-DSOUP_VERSION_MIN_REQUIRED=SOUP_VERSION_2_40 \
|
-DSOUP_VERSION_MIN_REQUIRED=SOUP_VERSION_2_40 \
|
||||||
-DSOUP_VERSION_MAX_ALLOWED=SOUP_VERSION_2_48
|
-DSOUP_VERSION_MAX_ALLOWED=SOUP_VERSION_2_48
|
||||||
AM_CFLAGS = -std=gnu99 $(WARN_CFLAGS)
|
AM_CFLAGS = -std=gnu99 $(WARN_CFLAGS)
|
||||||
|
|
||||||
|
# Allow the distcheck install under $prefix test to pass
|
||||||
AM_DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man \
|
AM_DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man \
|
||||||
--disable-maintainer-mode $(NULL) $(am__append_78)
|
--disable-maintainer-mode $(NULL) $(am__append_61) \
|
||||||
|
$(am__append_79) \
|
||||||
|
BASH_COMPLETIONSDIR='$${datadir}/bash-completion/completions'
|
||||||
SUBDIRS = . $(am__append_14)
|
SUBDIRS = . $(am__append_14)
|
||||||
NULL =
|
NULL =
|
||||||
BUILT_SOURCES = $(nodist_libostree_1_la_SOURCES)
|
BUILT_SOURCES = $(nodist_libostree_1_la_SOURCES)
|
||||||
|
|
@ -1980,7 +1990,7 @@ CLEANFILES = $(am__append_13) $(BUILT_SOURCES) $(am__append_46) \
|
||||||
tests/ostree-remount-symlink-stamp \
|
tests/ostree-remount-symlink-stamp \
|
||||||
tests/rofiles-fuse-symlink-stamp tests/ostree \
|
tests/rofiles-fuse-symlink-stamp tests/ostree \
|
||||||
tests/ostree-prepare-root tests/ostree-remount \
|
tests/ostree-prepare-root tests/ostree-remount \
|
||||||
tests/rofiles-fuse $(am__append_85)
|
tests/rofiles-fuse $(am__append_86)
|
||||||
EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) autogen.sh \
|
EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) autogen.sh \
|
||||||
COPYING README.md $(am__append_15) libglnx/README.md \
|
COPYING README.md $(am__append_15) libglnx/README.md \
|
||||||
libglnx/COPYING libglnx/libglnx.m4 $(NULL) \
|
libglnx/COPYING libglnx/libglnx.m4 $(NULL) \
|
||||||
|
|
@ -1997,19 +2007,19 @@ EXTRA_DIST = $(all_dist_test_scripts) $(all_dist_test_data) autogen.sh \
|
||||||
src/libostree/ostree-repo-deprecated.h \
|
src/libostree/ostree-repo-deprecated.h \
|
||||||
src/libostree/ostree-version.h src/ostree/parse-datetime.y \
|
src/libostree/ostree-version.h src/ostree/parse-datetime.y \
|
||||||
buildutil/tap-driver.sh buildutil/tap-test tests/glib.supp \
|
buildutil/tap-driver.sh buildutil/tap-test tests/glib.supp \
|
||||||
tests/ostree.supp $(NULL) $(am__append_64) $(am__append_66) \
|
tests/ostree.supp $(NULL) $(am__append_65) $(am__append_67) \
|
||||||
$(am__append_69) tests/libtest.sh $(am__append_70) \
|
$(am__append_70) tests/libtest.sh $(am__append_71) \
|
||||||
tests/libostreetest.h tests/libtest.sh \
|
tests/libostreetest.h tests/libtest.sh \
|
||||||
tests/gpg-verify-data/README.md $(NULL) \
|
tests/gpg-verify-data/README.md $(NULL) \
|
||||||
src/boot/dracut/module-setup.sh src/boot/dracut/ostree.conf \
|
src/boot/dracut/module-setup.sh src/boot/dracut/ostree.conf \
|
||||||
src/boot/mkinitcpio/ostree \
|
src/boot/mkinitcpio/ostree \
|
||||||
src/boot/ostree-prepare-root.service \
|
src/boot/ostree-prepare-root.service \
|
||||||
src/boot/ostree-remount.service src/boot/grub2/grub2-15_ostree \
|
src/boot/ostree-remount.service src/boot/grub2/grub2-15_ostree \
|
||||||
src/boot/grub2/ostree-grub-generator $(NULL) $(am__append_82) \
|
src/boot/grub2/ostree-grub-generator $(NULL) $(am__append_83) \
|
||||||
$(am__append_84)
|
$(am__append_85)
|
||||||
bin_SCRIPTS =
|
bin_SCRIPTS =
|
||||||
lib_LTLIBRARIES = libostree-1.la
|
lib_LTLIBRARIES = libostree-1.la
|
||||||
pkglibexec_SCRIPTS = $(am__append_79)
|
pkglibexec_SCRIPTS = $(am__append_80)
|
||||||
noinst_LTLIBRARIES = $(am__append_1) libglnx.la libbsdiff.la \
|
noinst_LTLIBRARIES = $(am__append_1) libglnx.la libbsdiff.la \
|
||||||
libotutil.la libostree-kernel-args.la $(am__append_18) \
|
libotutil.la libostree-kernel-args.la $(am__append_18) \
|
||||||
libostreetest.la
|
libostreetest.la
|
||||||
|
|
@ -2039,7 +2049,7 @@ AM_TESTS_ENVIRONMENT = G_TEST_SRCDIR="$(abs_srcdir)" \
|
||||||
LD_LIBRARY_PATH=$$(cd $(top_builddir)/.libs && \
|
LD_LIBRARY_PATH=$$(cd $(top_builddir)/.libs && \
|
||||||
pwd)$${LD_LIBRARY_PATH:+:$${LD_LIBRARY_PATH}} PATH=$$(cd \
|
pwd)$${LD_LIBRARY_PATH:+:$${LD_LIBRARY_PATH}} PATH=$$(cd \
|
||||||
$(top_builddir)/tests && pwd):$${PATH} \
|
$(top_builddir)/tests && pwd):$${PATH} \
|
||||||
OSTREE_FEATURES="$(OSTREE_FEATURES)" $(NULL) $(am__append_62)
|
OSTREE_FEATURES="$(OSTREE_FEATURES)" $(NULL) $(am__append_63)
|
||||||
LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/buildutil/tap-driver.sh
|
LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/buildutil/tap-driver.sh
|
||||||
LOG_COMPILER = $(top_srcdir)/buildutil/tap-test
|
LOG_COMPILER = $(top_srcdir)/buildutil/tap-test
|
||||||
installed_test_LTLIBRARIES = $(am__append_12)
|
installed_test_LTLIBRARIES = $(am__append_12)
|
||||||
|
|
@ -2079,8 +2089,8 @@ all_test_ltlibs = $(test_ltlibraries) $(uninstalled_test_ltlibraries) $(installe
|
||||||
# This initializes some more variables
|
# This initializes some more variables
|
||||||
|
|
||||||
# This is a special facility to chain together hooks easily
|
# This is a special facility to chain together hooks easily
|
||||||
INSTALL_DATA_HOOKS = install-mkdir-remotes-d-hook $(am__append_77) \
|
INSTALL_DATA_HOOKS = install-mkdir-remotes-d-hook $(am__append_78) \
|
||||||
$(am__append_80)
|
$(am__append_81)
|
||||||
ALL_LOCAL_RULES = tests/libreaddir-rand.so
|
ALL_LOCAL_RULES = tests/libreaddir-rand.so
|
||||||
shortened_sysconfdir = $$(echo "$(sysconfdir)" | sed -e 's|^$(prefix)||' -e 's|^/||')
|
shortened_sysconfdir = $$(echo "$(sysconfdir)" | sed -e 's|^$(prefix)||' -e 's|^/||')
|
||||||
OSTREE_GITREV = $(shell cd $(srcdir) && if command -v git >/dev/null 2>&1 && test -d .git; then git describe --abbrev=42 --tags --always HEAD; fi)
|
OSTREE_GITREV = $(shell cd $(srcdir) && if command -v git >/dev/null 2>&1 && test -d .git; then git describe --abbrev=42 --tags --always HEAD; fi)
|
||||||
|
|
@ -2439,9 +2449,9 @@ dist_uninstalled_test_scripts = tests/test-symbols.sh tests/coccinelle.sh
|
||||||
# tests *only* run installed, to avoid having to run them twice in CI.
|
# tests *only* run installed, to avoid having to run them twice in CI.
|
||||||
# This overrides the glib-tap.mk emphasis on doing both, if we'd
|
# This overrides the glib-tap.mk emphasis on doing both, if we'd
|
||||||
# used e.g. `dist_test_scripts`.
|
# used e.g. `dist_test_scripts`.
|
||||||
dist_test_scripts = $(NULL) $(am__append_75)
|
dist_test_scripts = $(NULL) $(am__append_76)
|
||||||
test_programs = $(NULL) $(am__append_72) $(am__append_73) \
|
test_programs = $(NULL) $(am__append_73) $(am__append_74) \
|
||||||
$(am__append_76)
|
$(am__append_77)
|
||||||
_installed_or_uninstalled_test_scripts = tests/test-basic.sh \
|
_installed_or_uninstalled_test_scripts = tests/test-basic.sh \
|
||||||
tests/test-basic-user.sh tests/test-basic-user-only.sh \
|
tests/test-basic-user.sh tests/test-basic-user-only.sh \
|
||||||
tests/test-basic-root.sh tests/test-pull-subpath.sh \
|
tests/test-basic-root.sh tests/test-pull-subpath.sh \
|
||||||
|
|
@ -2478,8 +2488,8 @@ _installed_or_uninstalled_test_scripts = tests/test-basic.sh \
|
||||||
tests/test-refs.sh tests/test-demo-buildsystem.sh \
|
tests/test-refs.sh tests/test-demo-buildsystem.sh \
|
||||||
tests/test-switchroot.sh tests/test-pull-contenturl.sh \
|
tests/test-switchroot.sh tests/test-pull-contenturl.sh \
|
||||||
tests/test-pull-mirrorlist.sh tests/test-summary-update.sh \
|
tests/test-pull-mirrorlist.sh tests/test-summary-update.sh \
|
||||||
tests/test-summary-view.sh $(NULL) $(am__append_63) \
|
tests/test-summary-view.sh $(NULL) $(am__append_64) \
|
||||||
$(am__append_65) $(am__append_67) $(am__append_68)
|
$(am__append_66) $(am__append_68) $(am__append_69)
|
||||||
experimental_test_scripts = \
|
experimental_test_scripts = \
|
||||||
tests/test-find-remotes.sh \
|
tests/test-find-remotes.sh \
|
||||||
tests/test-fsck-collections.sh \
|
tests/test-fsck-collections.sh \
|
||||||
|
|
@ -2528,6 +2538,7 @@ dist_test_extra_scripts = \
|
||||||
|
|
||||||
js_installed_tests = \
|
js_installed_tests = \
|
||||||
tests/test-core.js \
|
tests/test-core.js \
|
||||||
|
tests/test-remotes-config-dir.js \
|
||||||
tests/test-sizes.js \
|
tests/test-sizes.js \
|
||||||
tests/test-sysroot.js \
|
tests/test-sysroot.js \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
@ -2541,14 +2552,14 @@ libreaddir_rand_la_LIBADD = \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
libreaddir_rand_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version \
|
libreaddir_rand_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version \
|
||||||
$(am__append_71)
|
$(am__append_72)
|
||||||
_installed_or_uninstalled_test_programs = tests/test-varint \
|
_installed_or_uninstalled_test_programs = tests/test-varint \
|
||||||
tests/test-ot-unix-utils tests/test-bsdiff \
|
tests/test-ot-unix-utils tests/test-bsdiff \
|
||||||
tests/test-mutable-tree tests/test-keyfile-utils \
|
tests/test-mutable-tree tests/test-keyfile-utils \
|
||||||
tests/test-ot-opt-utils tests/test-ot-tool-util \
|
tests/test-ot-opt-utils tests/test-ot-tool-util \
|
||||||
tests/test-gpg-verify-result tests/test-checksum \
|
tests/test-gpg-verify-result tests/test-checksum \
|
||||||
tests/test-lzma tests/test-rollsum tests/test-basic-c \
|
tests/test-lzma tests/test-rollsum tests/test-basic-c \
|
||||||
tests/test-sysroot-c tests/test-pull-c $(am__append_74)
|
tests/test-sysroot-c tests/test-pull-c $(am__append_75)
|
||||||
common_tests_cflags = $(ostree_bin_shared_cflags) $(OT_INTERNAL_GIO_UNIX_CFLAGS) -I$(srcdir)/libglnx
|
common_tests_cflags = $(ostree_bin_shared_cflags) $(OT_INTERNAL_GIO_UNIX_CFLAGS) -I$(srcdir)/libglnx
|
||||||
common_tests_ldadd = $(ostree_bin_shared_ldadd) $(OT_INTERNAL_GIO_UNIX_LIBS)
|
common_tests_ldadd = $(ostree_bin_shared_ldadd) $(OT_INTERNAL_GIO_UNIX_LIBS)
|
||||||
libostreetest_la_SOURCES = tests/libostreetest.c tests/test-mock-gio.c tests/test-mock-gio.h
|
libostreetest_la_SOURCES = tests/libostreetest.c tests/test-mock-gio.c tests/test-mock-gio.h
|
||||||
|
|
@ -2629,6 +2640,8 @@ tests_test_gpg_verify_result_LDADD = $(TESTS_LDADD) $(OT_INTERNAL_GPGME_LIBS)
|
||||||
@BUILDOPT_SYSTEMD_TRUE@systemdsystemunit_DATA = src/boot/ostree-prepare-root.service \
|
@BUILDOPT_SYSTEMD_TRUE@systemdsystemunit_DATA = src/boot/ostree-prepare-root.service \
|
||||||
@BUILDOPT_SYSTEMD_TRUE@ src/boot/ostree-remount.service
|
@BUILDOPT_SYSTEMD_TRUE@ src/boot/ostree-remount.service
|
||||||
|
|
||||||
|
@BUILDOPT_SYSTEMD_TRUE@systemdtmpfilesdir = $(prefix)/lib/tmpfiles.d
|
||||||
|
@BUILDOPT_SYSTEMD_TRUE@dist_systemdtmpfiles_DATA = src/boot/ostree-tmpfiles.conf
|
||||||
@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@grub2configdir = $(sysconfdir)/grub.d
|
@BUILDOPT_BUILTIN_GRUB2_MKCONFIG_FALSE@grub2configdir = $(sysconfdir)/grub.d
|
||||||
@ENABLE_MAN_TRUE@man1_files = ostree.1 ostree-admin-cleanup.1 \
|
@ENABLE_MAN_TRUE@man1_files = ostree.1 ostree-admin-cleanup.1 \
|
||||||
@ENABLE_MAN_TRUE@ ostree-admin-config-diff.1 \
|
@ENABLE_MAN_TRUE@ ostree-admin-config-diff.1 \
|
||||||
|
|
@ -2647,8 +2660,8 @@ tests_test_gpg_verify_result_LDADD = $(TESTS_LDADD) $(OT_INTERNAL_GPGME_LIBS)
|
||||||
@ENABLE_MAN_TRUE@ ostree-pull.1 ostree-refs.1 ostree-remote.1 \
|
@ENABLE_MAN_TRUE@ ostree-pull.1 ostree-refs.1 ostree-remote.1 \
|
||||||
@ENABLE_MAN_TRUE@ ostree-reset.1 ostree-rev-parse.1 \
|
@ENABLE_MAN_TRUE@ ostree-reset.1 ostree-rev-parse.1 \
|
||||||
@ENABLE_MAN_TRUE@ ostree-show.1 ostree-summary.1 \
|
@ENABLE_MAN_TRUE@ ostree-show.1 ostree-summary.1 \
|
||||||
@ENABLE_MAN_TRUE@ ostree-static-delta.1 $(am__append_81) \
|
@ENABLE_MAN_TRUE@ ostree-static-delta.1 $(am__append_82) \
|
||||||
@ENABLE_MAN_TRUE@ $(am__append_83)
|
@ENABLE_MAN_TRUE@ $(am__append_84)
|
||||||
@ENABLE_MAN_TRUE@man5_files = ostree.repo.5 ostree.repo-config.5
|
@ENABLE_MAN_TRUE@man5_files = ostree.repo.5 ostree.repo-config.5
|
||||||
@ENABLE_MAN_TRUE@man1_MANS = $(addprefix man/,$(man1_files))
|
@ENABLE_MAN_TRUE@man1_MANS = $(addprefix man/,$(man1_files))
|
||||||
@ENABLE_MAN_TRUE@man5_MANS = $(addprefix man/,$(man5_files))
|
@ENABLE_MAN_TRUE@man5_MANS = $(addprefix man/,$(man5_files))
|
||||||
|
|
@ -6464,6 +6477,27 @@ uninstall-dist_gpgvinsttestDATA:
|
||||||
@list='$(dist_gpgvinsttest_DATA)'; test -n "$(gpgvinsttestdir)" || list=; \
|
@list='$(dist_gpgvinsttest_DATA)'; test -n "$(gpgvinsttestdir)" || list=; \
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
dir='$(DESTDIR)$(gpgvinsttestdir)'; $(am__uninstall_files_from_dir)
|
dir='$(DESTDIR)$(gpgvinsttestdir)'; $(am__uninstall_files_from_dir)
|
||||||
|
install-dist_systemdtmpfilesDATA: $(dist_systemdtmpfiles_DATA)
|
||||||
|
@$(NORMAL_INSTALL)
|
||||||
|
@list='$(dist_systemdtmpfiles_DATA)'; test -n "$(systemdtmpfilesdir)" || list=; \
|
||||||
|
if test -n "$$list"; then \
|
||||||
|
echo " $(MKDIR_P) '$(DESTDIR)$(systemdtmpfilesdir)'"; \
|
||||||
|
$(MKDIR_P) "$(DESTDIR)$(systemdtmpfilesdir)" || exit 1; \
|
||||||
|
fi; \
|
||||||
|
for p in $$list; do \
|
||||||
|
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
||||||
|
echo "$$d$$p"; \
|
||||||
|
done | $(am__base_list) | \
|
||||||
|
while read files; do \
|
||||||
|
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(systemdtmpfilesdir)'"; \
|
||||||
|
$(INSTALL_DATA) $$files "$(DESTDIR)$(systemdtmpfilesdir)" || exit $$?; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall-dist_systemdtmpfilesDATA:
|
||||||
|
@$(NORMAL_UNINSTALL)
|
||||||
|
@list='$(dist_systemdtmpfiles_DATA)'; test -n "$(systemdtmpfilesdir)" || list=; \
|
||||||
|
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
||||||
|
dir='$(DESTDIR)$(systemdtmpfilesdir)'; $(am__uninstall_files_from_dir)
|
||||||
install-dracutconfDATA: $(dracutconf_DATA)
|
install-dracutconfDATA: $(dracutconf_DATA)
|
||||||
@$(NORMAL_INSTALL)
|
@$(NORMAL_INSTALL)
|
||||||
@list='$(dracutconf_DATA)'; test -n "$(dracutconfdir)" || list=; \
|
@list='$(dracutconf_DATA)'; test -n "$(dracutconfdir)" || list=; \
|
||||||
|
|
@ -7583,6 +7617,13 @@ tests/test-core.js.log: tests/test-core.js
|
||||||
--log-file $$b.log --trs-file $$b.trs \
|
--log-file $$b.log --trs-file $$b.trs \
|
||||||
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||||
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||||
|
tests/test-remotes-config-dir.js.log: tests/test-remotes-config-dir.js
|
||||||
|
@p='tests/test-remotes-config-dir.js'; \
|
||||||
|
b='tests/test-remotes-config-dir.js'; \
|
||||||
|
$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
|
||||||
|
--log-file $$b.log --trs-file $$b.trs \
|
||||||
|
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
|
||||||
|
"$$tst" $(AM_TESTS_FD_REDIRECT)
|
||||||
tests/test-sizes.js.log: tests/test-sizes.js
|
tests/test-sizes.js.log: tests/test-sizes.js
|
||||||
@p='tests/test-sizes.js'; \
|
@p='tests/test-sizes.js'; \
|
||||||
b='tests/test-sizes.js'; \
|
b='tests/test-sizes.js'; \
|
||||||
|
|
@ -7858,7 +7899,7 @@ install-binPROGRAMS: install-libLTLIBRARIES
|
||||||
|
|
||||||
installdirs: installdirs-recursive
|
installdirs: installdirs-recursive
|
||||||
installdirs-am:
|
installdirs-am:
|
||||||
for dir in "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(privlibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(ostree_bootdir)" "$(DESTDIR)$(pkglibexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(systemdsystemgeneratordir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(dracutmoddir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(mkinitcpioinstalldir)" "$(DESTDIR)$(ostree_bootdir)" "$(DESTDIR)$(pkglibexecdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(completionsdir)" "$(DESTDIR)$(gpginsttestdir)" "$(DESTDIR)$(gpginsttest_trusteddir)" "$(DESTDIR)$(gpgvinsttestdir)" "$(DESTDIR)$(dracutconfdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(gpgreadmedir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_test_metadir)" "$(DESTDIR)$(mkinitcpioconfdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(systemdsystemunitdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(libostreeincludedir)"; do \
|
for dir in "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(privlibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(ostree_bootdir)" "$(DESTDIR)$(pkglibexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(systemdsystemgeneratordir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(dracutmoddir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(mkinitcpioinstalldir)" "$(DESTDIR)$(ostree_bootdir)" "$(DESTDIR)$(pkglibexecdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(completionsdir)" "$(DESTDIR)$(gpginsttestdir)" "$(DESTDIR)$(gpginsttest_trusteddir)" "$(DESTDIR)$(gpgvinsttestdir)" "$(DESTDIR)$(systemdtmpfilesdir)" "$(DESTDIR)$(dracutconfdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(gpgreadmedir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(installed_test_metadir)" "$(DESTDIR)$(mkinitcpioconfdir)" "$(DESTDIR)$(installed_testdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(systemdsystemunitdir)" "$(DESTDIR)$(typelibdir)" "$(DESTDIR)$(libostreeincludedir)"; do \
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
||||||
done
|
done
|
||||||
install: $(BUILT_SOURCES)
|
install: $(BUILT_SOURCES)
|
||||||
|
|
@ -7949,8 +7990,9 @@ info-am:
|
||||||
install-data-am: install-dist_completionsDATA \
|
install-data-am: install-dist_completionsDATA \
|
||||||
install-dist_gpginsttestDATA \
|
install-dist_gpginsttestDATA \
|
||||||
install-dist_gpginsttest_trustedDATA \
|
install-dist_gpginsttest_trustedDATA \
|
||||||
install-dist_gpgvinsttestDATA install-dracutconfDATA \
|
install-dist_gpgvinsttestDATA install-dist_systemdtmpfilesDATA \
|
||||||
install-dracutmodSCRIPTS install-girDATA install-gpgreadmeDATA \
|
install-dracutconfDATA install-dracutmodSCRIPTS \
|
||||||
|
install-girDATA install-gpgreadmeDATA \
|
||||||
install-installed_testDATA install-installed_testLTLIBRARIES \
|
install-installed_testDATA install-installed_testLTLIBRARIES \
|
||||||
install-installed_testPROGRAMS install-installed_testSCRIPTS \
|
install-installed_testPROGRAMS install-installed_testSCRIPTS \
|
||||||
install-installed_test_metaDATA \
|
install-installed_test_metaDATA \
|
||||||
|
|
@ -8015,7 +8057,8 @@ ps-am:
|
||||||
uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
|
uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
|
||||||
uninstall-dist_completionsDATA uninstall-dist_gpginsttestDATA \
|
uninstall-dist_completionsDATA uninstall-dist_gpginsttestDATA \
|
||||||
uninstall-dist_gpginsttest_trustedDATA \
|
uninstall-dist_gpginsttest_trustedDATA \
|
||||||
uninstall-dist_gpgvinsttestDATA uninstall-dracutconfDATA \
|
uninstall-dist_gpgvinsttestDATA \
|
||||||
|
uninstall-dist_systemdtmpfilesDATA uninstall-dracutconfDATA \
|
||||||
uninstall-dracutmodSCRIPTS uninstall-girDATA \
|
uninstall-dracutmodSCRIPTS uninstall-girDATA \
|
||||||
uninstall-gpgreadmeDATA uninstall-installed_testDATA \
|
uninstall-gpgreadmeDATA uninstall-installed_testDATA \
|
||||||
uninstall-installed_testLTLIBRARIES \
|
uninstall-installed_testLTLIBRARIES \
|
||||||
|
|
@ -8057,9 +8100,9 @@ uninstall-man: uninstall-man1 uninstall-man5
|
||||||
install-data install-data-am install-data-hook \
|
install-data install-data-am install-data-hook \
|
||||||
install-dist_completionsDATA install-dist_gpginsttestDATA \
|
install-dist_completionsDATA install-dist_gpginsttestDATA \
|
||||||
install-dist_gpginsttest_trustedDATA \
|
install-dist_gpginsttest_trustedDATA \
|
||||||
install-dist_gpgvinsttestDATA install-dracutconfDATA \
|
install-dist_gpgvinsttestDATA install-dist_systemdtmpfilesDATA \
|
||||||
install-dracutmodSCRIPTS install-dvi install-dvi-am \
|
install-dracutconfDATA install-dracutmodSCRIPTS install-dvi \
|
||||||
install-exec install-exec-am install-girDATA \
|
install-dvi-am install-exec install-exec-am install-girDATA \
|
||||||
install-gpgreadmeDATA install-html install-html-am \
|
install-gpgreadmeDATA install-html install-html-am \
|
||||||
install-info install-info-am install-installed_testDATA \
|
install-info install-info-am install-installed_testDATA \
|
||||||
install-installed_testLTLIBRARIES \
|
install-installed_testLTLIBRARIES \
|
||||||
|
|
@ -8082,7 +8125,8 @@ uninstall-man: uninstall-man1 uninstall-man5
|
||||||
uninstall-binPROGRAMS uninstall-binSCRIPTS \
|
uninstall-binPROGRAMS uninstall-binSCRIPTS \
|
||||||
uninstall-dist_completionsDATA uninstall-dist_gpginsttestDATA \
|
uninstall-dist_completionsDATA uninstall-dist_gpginsttestDATA \
|
||||||
uninstall-dist_gpginsttest_trustedDATA \
|
uninstall-dist_gpginsttest_trustedDATA \
|
||||||
uninstall-dist_gpgvinsttestDATA uninstall-dracutconfDATA \
|
uninstall-dist_gpgvinsttestDATA \
|
||||||
|
uninstall-dist_systemdtmpfilesDATA uninstall-dracutconfDATA \
|
||||||
uninstall-dracutmodSCRIPTS uninstall-girDATA \
|
uninstall-dracutmodSCRIPTS uninstall-girDATA \
|
||||||
uninstall-gpgreadmeDATA uninstall-installed_testDATA \
|
uninstall-gpgreadmeDATA uninstall-installed_testDATA \
|
||||||
uninstall-installed_testLTLIBRARIES \
|
uninstall-installed_testLTLIBRARIES \
|
||||||
|
|
|
||||||
34
README.md
34
README.md
|
|
@ -1,19 +1,22 @@
|
||||||
libOSTree
|
libostree
|
||||||
======
|
---------
|
||||||
|
|
||||||
New! See the docs online at [Read The Docs (OSTree)](https://ostree.readthedocs.org/en/latest/ )
|
New! See the docs online at [Read The Docs (OSTree)](https://ostree.readthedocs.org/en/latest/ )
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
This project is now known as "libOSTree", renamed from "OSTree"; the focus is on
|
This project is now known as "libostree", though it is still appropriate to use
|
||||||
the shared library. However, in most of the rest of the documentation, we will
|
the previous name: "OSTree" (or "ostree"). The focus is on projects which use
|
||||||
use the term "OSTree", since it's slightly shorter, and changing all
|
libostree's shared library, rather than users directly invoking the command line
|
||||||
documentation at once is impractical. We expect to transition to the new name
|
tools (except for build systems). However, in most of the rest of the
|
||||||
over time.
|
documentation, we will use the term "OSTree", since it's slightly shorter, and
|
||||||
|
changing all documentation at once is impractical. We expect to transition to
|
||||||
|
the new name over time.
|
||||||
|
|
||||||
libOSTree is a library and suite of command line tools that combines a
|
As implied above, libostree is both a shared library and suite of command line
|
||||||
"git-like" model for committing and downloading bootable filesystem trees, along
|
tools that combines a "git-like" model for committing and downloading bootable
|
||||||
with a layer for deploying them and managing the bootloader configuration.
|
filesystem trees, along with a layer for deploying them and managing the
|
||||||
|
bootloader configuration.
|
||||||
|
|
||||||
The core OSTree model is like git in that it checksums individual files and has
|
The core OSTree model is like git in that it checksums individual files and has
|
||||||
a content-addressed-object store. It's unlike git in that it "checks out" the
|
a content-addressed-object store. It's unlike git in that it "checks out" the
|
||||||
|
|
@ -24,16 +27,14 @@ of
|
||||||
|
|
||||||
**Features:**
|
**Features:**
|
||||||
|
|
||||||
- Atomic upgrades and rollback for the system
|
- Transactional upgrades and rollback for the system
|
||||||
- Replicating content incrementally over HTTP via GPG signatures and "pinned TLS" support
|
- Replicating content incrementally over HTTP via GPG signatures and "pinned TLS" support
|
||||||
- Support for parallel installing more than just 2 bootable roots
|
- Support for parallel installing more than just 2 bootable roots
|
||||||
- Binary history on the server side (and client)
|
- Binary history on the server side (and client)
|
||||||
- Introspectable shared library API for build and deployment systems
|
- Introspectable shared library API for build and deployment systems
|
||||||
|
- Flexible support for multiple branches and repositories, supporting
|
||||||
This last point is important - you should think of the OSTree command
|
projects like [flatpak](https://github.com/flatpak/flatpak) which
|
||||||
line as effectively a "demo" for the shared library. The intent is that
|
use libostree for applications, rather than hosts.
|
||||||
package managers, system upgrade tools, container build tools and the like
|
|
||||||
use OSTree as a "deduplicating hardlink store".
|
|
||||||
|
|
||||||
Projects using OSTree
|
Projects using OSTree
|
||||||
---------------------
|
---------------------
|
||||||
|
|
@ -87,6 +88,7 @@ Once you have a git clone or recursive archive, building is the
|
||||||
same as almost every autotools project:
|
same as almost every autotools project:
|
||||||
|
|
||||||
```
|
```
|
||||||
|
git submodule update --init
|
||||||
env NOCONFIGURE=1 ./autogen.sh
|
env NOCONFIGURE=1 ./autogen.sh
|
||||||
./configure --prefix=...
|
./configure --prefix=...
|
||||||
make
|
make
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
<div class="titlepage">
|
<div class="titlepage">
|
||||||
<div>
|
<div>
|
||||||
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">OSTree API references</p></th></tr></table></div>
|
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">OSTree API references</p></th></tr></table></div>
|
||||||
<div><p class="releaseinfo">for OSTree 2017.10</p></div>
|
<div><p class="releaseinfo">for OSTree 2017.11</p></div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
<span class="refentrytitle"><a href="ostree-Core-repository-independent-functions.html">Core repository-independent functions</a></span><span class="refpurpose"> — Create, validate, and convert core data types</span>
|
<span class="refentrytitle"><a href="ostree-Core-repository-independent-functions.html">Core repository-independent functions</a></span><span class="refpurpose"> — Create, validate, and convert core data types</span>
|
||||||
</dt>
|
</dt>
|
||||||
<dt>
|
<dt>
|
||||||
<span class="refentrytitle"><a href="ostree-Content-addressed-object-store.html">Content-addressed object store</a></span><span class="refpurpose"> — A git-like storage system for operating system binaries</span>
|
<span class="refentrytitle"><a href="ostree-OstreeRepo.html">OstreeRepo: Content-addressed object store</a></span><span class="refpurpose"> — A git-like storage system for operating system binaries</span>
|
||||||
</dt>
|
</dt>
|
||||||
<dt>
|
<dt>
|
||||||
<span class="refentrytitle"><a href="ostree-In-memory-modifiable-filesystem-tree.html">In-memory modifiable filesystem tree</a></span><span class="refpurpose"> — Modifiable filesystem tree</span>
|
<span class="refentrytitle"><a href="ostree-In-memory-modifiable-filesystem-tree.html">In-memory modifiable filesystem tree</a></span><span class="refpurpose"> — Modifiable filesystem tree</span>
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
<link rel="home" href="index.html" title="OSTree API references">
|
<link rel="home" href="index.html" title="OSTree API references">
|
||||||
<link rel="up" href="reference.html" title="API Reference">
|
<link rel="up" href="reference.html" title="API Reference">
|
||||||
<link rel="prev" href="reference.html" title="API Reference">
|
<link rel="prev" href="reference.html" title="API Reference">
|
||||||
<link rel="next" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">
|
<link rel="next" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">
|
||||||
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
|
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
</head>
|
</head>
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
|
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
|
||||||
<td><a accesskey="u" href="reference.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
|
<td><a accesskey="u" href="reference.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
|
||||||
<td><a accesskey="p" href="reference.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
|
<td><a accesskey="p" href="reference.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
|
||||||
<td><a accesskey="n" href="ostree-Content-addressed-object-store.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
|
<td><a accesskey="n" href="ostree-OstreeRepo.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<div class="refentry">
|
<div class="refentry">
|
||||||
<a name="ostree-Core-repository-independent-functions"></a><div class="titlepage"></div>
|
<a name="ostree-Core-repository-independent-functions"></a><div class="titlepage"></div>
|
||||||
|
|
@ -1627,7 +1627,7 @@ ostree_raw_file_to_content_stream (<em class="parameter"><code><span class="type
|
||||||
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
|
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
|
||||||
<p>Convert from a "bare" file representation into an
|
<p>Convert from a "bare" file representation into an
|
||||||
OSTREE_OBJECT_TYPE_FILE stream. This is a fundamental operation
|
OSTREE_OBJECT_TYPE_FILE stream. This is a fundamental operation
|
||||||
for writing data to an <a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a>.</p>
|
for writing data to an <a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a>.</p>
|
||||||
<div class="refsect3">
|
<div class="refsect3">
|
||||||
<a name="ostree-raw-file-to-content-stream.parameters"></a><h4>Parameters</h4>
|
<a name="ostree-raw-file-to-content-stream.parameters"></a><h4>Parameters</h4>
|
||||||
<div class="informaltable"><table class="informaltable" width="100%" border="0">
|
<div class="informaltable"><table class="informaltable" width="100%" border="0">
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@
|
||||||
<div class="refsect1">
|
<div class="refsect1">
|
||||||
<a name="ostree-GPG-signature-verification-results.description"></a><h2>Description</h2>
|
<a name="ostree-GPG-signature-verification-results.description"></a><h2>Description</h2>
|
||||||
<p><a class="link" href="ostree-GPG-signature-verification-results.html#OstreeGpgVerifyResult" title="OstreeGpgVerifyResult"><span class="type">OstreeGpgVerifyResult</span></a> contains verification details for GPG signatures
|
<p><a class="link" href="ostree-GPG-signature-verification-results.html#OstreeGpgVerifyResult" title="OstreeGpgVerifyResult"><span class="type">OstreeGpgVerifyResult</span></a> contains verification details for GPG signatures
|
||||||
read from a detached <a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a> metadata object.</p>
|
read from a detached <a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a> metadata object.</p>
|
||||||
<p>Use <a class="link" href="ostree-GPG-signature-verification-results.html#ostree-gpg-verify-result-count-all" title="ostree_gpg_verify_result_count_all ()"><code class="function">ostree_gpg_verify_result_count_all()</code></a> and
|
<p>Use <a class="link" href="ostree-GPG-signature-verification-results.html#ostree-gpg-verify-result-count-all" title="ostree_gpg_verify_result_count_all ()"><code class="function">ostree_gpg_verify_result_count_all()</code></a> and
|
||||||
<a class="link" href="ostree-GPG-signature-verification-results.html#ostree-gpg-verify-result-count-valid" title="ostree_gpg_verify_result_count_valid ()"><code class="function">ostree_gpg_verify_result_count_valid()</code></a> to quickly check overall signature
|
<a class="link" href="ostree-GPG-signature-verification-results.html#ostree-gpg-verify-result-count-valid" title="ostree_gpg_verify_result_count_valid ()"><code class="function">ostree_gpg_verify_result_count_valid()</code></a> to quickly check overall signature
|
||||||
validity.</p>
|
validity.</p>
|
||||||
|
|
@ -482,7 +482,7 @@ ostree_gpg_verify_result_require_valid_signature
|
||||||
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
|
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
|
||||||
<p>Checks if the result contains at least one signature from the
|
<p>Checks if the result contains at least one signature from the
|
||||||
trusted keyring. You can call this function immediately after
|
trusted keyring. You can call this function immediately after
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-verify-summary" title="ostree_repo_verify_summary ()"><code class="function">ostree_repo_verify_summary()</code></a> or <a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-verify-commit-ext" title="ostree_repo_verify_commit_ext ()"><code class="function">ostree_repo_verify_commit_ext()</code></a> -
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-verify-summary" title="ostree_repo_verify_summary ()"><code class="function">ostree_repo_verify_summary()</code></a> or <a class="link" href="ostree-OstreeRepo.html#ostree-repo-verify-commit-ext" title="ostree_repo_verify_commit_ext ()"><code class="function">ostree_repo_verify_commit_ext()</code></a> -
|
||||||
it will handle the <code class="literal">NULL</code> <em class="parameter"><code>result</code></em>
|
it will handle the <code class="literal">NULL</code> <em class="parameter"><code>result</code></em>
|
||||||
and filled <em class="parameter"><code>error</code></em>
|
and filled <em class="parameter"><code>error</code></em>
|
||||||
too.</p>
|
too.</p>
|
||||||
|
|
@ -666,6 +666,16 @@ The attribute's <span class="type">GVariantType</span> is shown in brackets.</p>
|
||||||
</td>
|
</td>
|
||||||
<td class="enum_member_annotations"> </td>
|
<td class="enum_member_annotations"> </td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="enum_member_name"><p><a name="OSTREE-GPG-SIGNATURE-ATTR-FINGERPRINT-PRIMARY:CAPS"></a>OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT_PRIMARY</p></td>
|
||||||
|
<td class="enum_member_description">
|
||||||
|
<p> [<span class="type">G_VARIANT_TYPE_STRING</span>] Fingerprint of the signing key's primary key
|
||||||
|
(will be the same as OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT if the
|
||||||
|
the signature is already from the primary key rather than a subkey,
|
||||||
|
and will be the empty string if the key is missing.)</p>
|
||||||
|
</td>
|
||||||
|
<td class="enum_member_annotations"> </td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table></div>
|
</table></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
|
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
|
||||||
<link rel="home" href="index.html" title="OSTree API references">
|
<link rel="home" href="index.html" title="OSTree API references">
|
||||||
<link rel="up" href="reference.html" title="API Reference">
|
<link rel="up" href="reference.html" title="API Reference">
|
||||||
<link rel="prev" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">
|
<link rel="prev" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">
|
||||||
<link rel="next" href="ostree-Root-partition-mount-point.html" title="Root partition mount point">
|
<link rel="next" href="ostree-Root-partition-mount-point.html" title="Root partition mount point">
|
||||||
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
|
<meta name="generator" content="GTK-Doc V1.25 (XML mode)">
|
||||||
<link rel="stylesheet" href="style.css" type="text/css">
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
</td>
|
</td>
|
||||||
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
|
<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
|
||||||
<td><a accesskey="u" href="reference.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
|
<td><a accesskey="u" href="reference.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
|
||||||
<td><a accesskey="p" href="ostree-Content-addressed-object-store.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
|
<td><a accesskey="p" href="ostree-OstreeRepo.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
|
||||||
<td><a accesskey="n" href="ostree-Root-partition-mount-point.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
|
<td><a accesskey="n" href="ostree-Root-partition-mount-point.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
<div class="refentry">
|
<div class="refentry">
|
||||||
|
|
@ -151,7 +151,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="refsect1">
|
<div class="refsect1">
|
||||||
<a name="ostree-In-memory-modifiable-filesystem-tree.description"></a><h2>Description</h2>
|
<a name="ostree-In-memory-modifiable-filesystem-tree.description"></a><h2>Description</h2>
|
||||||
<p>In order to commit content into an <a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a>, it must first be
|
<p>In order to commit content into an <a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a>, it must first be
|
||||||
imported into an <a class="link" href="ostree-In-memory-modifiable-filesystem-tree.html#OstreeMutableTree" title="OstreeMutableTree"><span class="type">OstreeMutableTree</span></a>. There are several high level
|
imported into an <a class="link" href="ostree-In-memory-modifiable-filesystem-tree.html#OstreeMutableTree" title="OstreeMutableTree"><span class="type">OstreeMutableTree</span></a>. There are several high level
|
||||||
APIs to create an initiable <a class="link" href="ostree-In-memory-modifiable-filesystem-tree.html#OstreeMutableTree" title="OstreeMutableTree"><span class="type">OstreeMutableTree</span></a> from a physical
|
APIs to create an initiable <a class="link" href="ostree-In-memory-modifiable-filesystem-tree.html#OstreeMutableTree" title="OstreeMutableTree"><span class="type">OstreeMutableTree</span></a> from a physical
|
||||||
filesystem directory, but they may also be computed
|
filesystem directory, but they may also be computed
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -217,7 +217,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="function_type">
|
<td class="function_type">
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="returnvalue">OstreeRepo</span></a> *
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="returnvalue">OstreeRepo</span></a> *
|
||||||
</td>
|
</td>
|
||||||
<td class="function_name">
|
<td class="function_name">
|
||||||
<a class="link" href="ostree-Root-partition-mount-point.html#ostree-sysroot-repo" title="ostree_sysroot_repo ()">ostree_sysroot_repo</a> <span class="c_punctuation">()</span>
|
<a class="link" href="ostree-Root-partition-mount-point.html#ostree-sysroot-repo" title="ostree_sysroot_repo ()">ostree_sysroot_repo</a> <span class="c_punctuation">()</span>
|
||||||
|
|
@ -353,7 +353,7 @@
|
||||||
<a name="ostree-Root-partition-mount-point.description"></a><h2>Description</h2>
|
<a name="ostree-Root-partition-mount-point.description"></a><h2>Description</h2>
|
||||||
<p>A <a class="link" href="ostree-Root-partition-mount-point.html#OstreeSysroot" title="OstreeSysroot"><span class="type">OstreeSysroot</span></a> object represents a physical root filesystem,
|
<p>A <a class="link" href="ostree-Root-partition-mount-point.html#OstreeSysroot" title="OstreeSysroot"><span class="type">OstreeSysroot</span></a> object represents a physical root filesystem,
|
||||||
which in particular should contain a toplevel /ostree directory.
|
which in particular should contain a toplevel /ostree directory.
|
||||||
Inside this directory is an <a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a> in /ostree/repo, plus a set
|
Inside this directory is an <a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a> in /ostree/repo, plus a set
|
||||||
of deployments in /ostree/deploy.</p>
|
of deployments in /ostree/deploy.</p>
|
||||||
<p>This class is not by default safe against concurrent use by threads
|
<p>This class is not by default safe against concurrent use by threads
|
||||||
or external processes. You can use <a class="link" href="ostree-Root-partition-mount-point.html#ostree-sysroot-lock" title="ostree_sysroot_lock ()"><code class="function">ostree_sysroot_lock()</code></a> to
|
or external processes. You can use <a class="link" href="ostree-Root-partition-mount-point.html#ostree-sysroot-lock" title="ostree_sysroot_lock ()"><code class="function">ostree_sysroot_lock()</code></a> to
|
||||||
|
|
@ -971,7 +971,7 @@ and old boot versions, but does NOT prune the repository.</p>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="refsect2">
|
<div class="refsect2">
|
||||||
<a name="ostree-sysroot-repo"></a><h3>ostree_sysroot_repo ()</h3>
|
<a name="ostree-sysroot-repo"></a><h3>ostree_sysroot_repo ()</h3>
|
||||||
<pre class="programlisting"><a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="returnvalue">OstreeRepo</span></a> *
|
<pre class="programlisting"><a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="returnvalue">OstreeRepo</span></a> *
|
||||||
ostree_sysroot_repo (<em class="parameter"><code><a class="link" href="ostree-Root-partition-mount-point.html#OstreeSysroot" title="OstreeSysroot"><span class="type">OstreeSysroot</span></a> *self</code></em>);</pre>
|
ostree_sysroot_repo (<em class="parameter"><code><a class="link" href="ostree-Root-partition-mount-point.html#OstreeSysroot" title="OstreeSysroot"><span class="type">OstreeSysroot</span></a> *self</code></em>);</pre>
|
||||||
<p>This function is a variant of <a class="link" href="ostree-Root-partition-mount-point.html#ostree-sysroot-get-repo" title="ostree_sysroot_get_repo ()"><code class="function">ostree_sysroot_get_repo()</code></a> that cannot fail, and
|
<p>This function is a variant of <a class="link" href="ostree-Root-partition-mount-point.html#ostree-sysroot-get-repo" title="ostree_sysroot_get_repo ()"><code class="function">ostree_sysroot_get_repo()</code></a> that cannot fail, and
|
||||||
returns a cached repository. Can only be called after <a class="link" href="ostree-Root-partition-mount-point.html#ostree-sysroot-load" title="ostree_sysroot_load ()"><code class="function">ostree_sysroot_load()</code></a>
|
returns a cached repository. Can only be called after <a class="link" href="ostree-Root-partition-mount-point.html#ostree-sysroot-load" title="ostree_sysroot_load ()"><code class="function">ostree_sysroot_load()</code></a>
|
||||||
|
|
@ -1003,7 +1003,7 @@ has been invoked successfully.</p>
|
||||||
<a name="ostree-sysroot-get-repo"></a><h3>ostree_sysroot_get_repo ()</h3>
|
<a name="ostree-sysroot-get-repo"></a><h3>ostree_sysroot_get_repo ()</h3>
|
||||||
<pre class="programlisting"><span class="returnvalue">gboolean</span>
|
<pre class="programlisting"><span class="returnvalue">gboolean</span>
|
||||||
ostree_sysroot_get_repo (<em class="parameter"><code><a class="link" href="ostree-Root-partition-mount-point.html#OstreeSysroot" title="OstreeSysroot"><span class="type">OstreeSysroot</span></a> *self</code></em>,
|
ostree_sysroot_get_repo (<em class="parameter"><code><a class="link" href="ostree-Root-partition-mount-point.html#OstreeSysroot" title="OstreeSysroot"><span class="type">OstreeSysroot</span></a> *self</code></em>,
|
||||||
<em class="parameter"><code><a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a> **out_repo</code></em>,
|
<em class="parameter"><code><a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a> **out_repo</code></em>,
|
||||||
<em class="parameter"><code><span class="type">GCancellable</span> *cancellable</code></em>,
|
<em class="parameter"><code><span class="type">GCancellable</span> *cancellable</code></em>,
|
||||||
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
|
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
|
||||||
<p>Retrieve the OSTree repository in sysroot <em class="parameter"><code>self</code></em>
|
<p>Retrieve the OSTree repository in sysroot <em class="parameter"><code>self</code></em>
|
||||||
|
|
@ -1611,6 +1611,10 @@ except the merge deployment and the booted deployment will be
|
||||||
garbage collected.</p>
|
garbage collected.</p>
|
||||||
<p>If <a class="link" href="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN:CAPS"><code class="literal">OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN</code></a> is
|
<p>If <a class="link" href="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN:CAPS"><code class="literal">OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN</code></a> is
|
||||||
specified, then all current deployments will be kept.</p>
|
specified, then all current deployments will be kept.</p>
|
||||||
|
<p>If <a class="link" href="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN-PENDING:CAPS"><code class="literal">OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_PENDING</code></a> is
|
||||||
|
specified, then pending deployments will be kept.</p>
|
||||||
|
<p>If <a class="link" href="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN-ROLLBACK:CAPS"><code class="literal">OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_ROLLBACK</code></a> is
|
||||||
|
specified, then rollback deployments will be kept.</p>
|
||||||
<p>If <a class="link" href="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-NOT-DEFAULT:CAPS"><code class="literal">OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT</code></a> is
|
<p>If <a class="link" href="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-NOT-DEFAULT:CAPS"><code class="literal">OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT</code></a> is
|
||||||
specified, then instead of prepending, the new deployment will be
|
specified, then instead of prepending, the new deployment will be
|
||||||
added right after the booted or merge deployment, instead of first.</p>
|
added right after the booted or merge deployment, instead of first.</p>
|
||||||
|
|
@ -1706,6 +1710,16 @@ later, instead.</p>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="enum_member_name"><p><a name="OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN-PENDING:CAPS"></a>OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_PENDING</p></td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="enum_member_name"><p><a name="OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN-ROLLBACK:CAPS"></a>OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_ROLLBACK</p></td>
|
||||||
|
<td> </td>
|
||||||
|
<td> </td>
|
||||||
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table></div>
|
</table></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -424,7 +424,7 @@ ostree_sysroot_upgrader_get_origin_description
|
||||||
<a name="ostree-sysroot-upgrader-check-timestamps"></a><h3>ostree_sysroot_upgrader_check_timestamps ()</h3>
|
<a name="ostree-sysroot-upgrader-check-timestamps"></a><h3>ostree_sysroot_upgrader_check_timestamps ()</h3>
|
||||||
<pre class="programlisting"><span class="returnvalue">gboolean</span>
|
<pre class="programlisting"><span class="returnvalue">gboolean</span>
|
||||||
ostree_sysroot_upgrader_check_timestamps
|
ostree_sysroot_upgrader_check_timestamps
|
||||||
(<em class="parameter"><code><a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a> *repo</code></em>,
|
(<em class="parameter"><code><a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="type">OstreeRepo</span></a> *repo</code></em>,
|
||||||
<em class="parameter"><code>const <span class="type">char</span> *from_rev</code></em>,
|
<em class="parameter"><code>const <span class="type">char</span> *from_rev</code></em>,
|
||||||
<em class="parameter"><code>const <span class="type">char</span> *to_rev</code></em>,
|
<em class="parameter"><code>const <span class="type">char</span> *to_rev</code></em>,
|
||||||
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
|
<em class="parameter"><code><span class="type">GError</span> **error</code></em>);</pre>
|
||||||
|
|
@ -471,7 +471,7 @@ attackers which provide a client with an older commit.</p>
|
||||||
<a name="ostree-sysroot-upgrader-pull"></a><h3>ostree_sysroot_upgrader_pull ()</h3>
|
<a name="ostree-sysroot-upgrader-pull"></a><h3>ostree_sysroot_upgrader_pull ()</h3>
|
||||||
<pre class="programlisting"><span class="returnvalue">gboolean</span>
|
<pre class="programlisting"><span class="returnvalue">gboolean</span>
|
||||||
ostree_sysroot_upgrader_pull (<em class="parameter"><code><a class="link" href="ostree-Simple-upgrade-class.html#OstreeSysrootUpgrader" title="OstreeSysrootUpgrader"><span class="type">OstreeSysrootUpgrader</span></a> *self</code></em>,
|
ostree_sysroot_upgrader_pull (<em class="parameter"><code><a class="link" href="ostree-Simple-upgrade-class.html#OstreeSysrootUpgrader" title="OstreeSysrootUpgrader"><span class="type">OstreeSysrootUpgrader</span></a> *self</code></em>,
|
||||||
<em class="parameter"><code><a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoPullFlags" title="enum OstreeRepoPullFlags"><span class="type">OstreeRepoPullFlags</span></a> flags</code></em>,
|
<em class="parameter"><code><a class="link" href="ostree-OstreeRepo.html#OstreeRepoPullFlags" title="enum OstreeRepoPullFlags"><span class="type">OstreeRepoPullFlags</span></a> flags</code></em>,
|
||||||
<em class="parameter"><code><a class="link" href="ostree-Simple-upgrade-class.html#OstreeSysrootUpgraderPullFlags" title="enum OstreeSysrootUpgraderPullFlags"><span class="type">OstreeSysrootUpgraderPullFlags</span></a> upgrader_flags</code></em>,
|
<em class="parameter"><code><a class="link" href="ostree-Simple-upgrade-class.html#OstreeSysrootUpgraderPullFlags" title="enum OstreeSysrootUpgraderPullFlags"><span class="type">OstreeSysrootUpgraderPullFlags</span></a> upgrader_flags</code></em>,
|
||||||
<em class="parameter"><code><a class="link" href="ostree-Progress-notification-system-for-asynchronous-operations.html#OstreeAsyncProgress" title="OstreeAsyncProgress"><span class="type">OstreeAsyncProgress</span></a> *progress</code></em>,
|
<em class="parameter"><code><a class="link" href="ostree-Progress-notification-system-for-asynchronous-operations.html#OstreeAsyncProgress" title="OstreeAsyncProgress"><span class="type">OstreeAsyncProgress</span></a> *progress</code></em>,
|
||||||
<em class="parameter"><code><span class="type">gboolean</span> *out_changed</code></em>,
|
<em class="parameter"><code><span class="type">gboolean</span> *out_changed</code></em>,
|
||||||
|
|
@ -538,7 +538,7 @@ ref locally. Then <em class="parameter"><code>out_changed</code></em>
|
||||||
<pre class="programlisting"><span class="returnvalue">gboolean</span>
|
<pre class="programlisting"><span class="returnvalue">gboolean</span>
|
||||||
ostree_sysroot_upgrader_pull_one_dir (<em class="parameter"><code><a class="link" href="ostree-Simple-upgrade-class.html#OstreeSysrootUpgrader" title="OstreeSysrootUpgrader"><span class="type">OstreeSysrootUpgrader</span></a> *self</code></em>,
|
ostree_sysroot_upgrader_pull_one_dir (<em class="parameter"><code><a class="link" href="ostree-Simple-upgrade-class.html#OstreeSysrootUpgrader" title="OstreeSysrootUpgrader"><span class="type">OstreeSysrootUpgrader</span></a> *self</code></em>,
|
||||||
<em class="parameter"><code>const <span class="type">char</span> *dir_to_pull</code></em>,
|
<em class="parameter"><code>const <span class="type">char</span> *dir_to_pull</code></em>,
|
||||||
<em class="parameter"><code><a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoPullFlags" title="enum OstreeRepoPullFlags"><span class="type">OstreeRepoPullFlags</span></a> flags</code></em>,
|
<em class="parameter"><code><a class="link" href="ostree-OstreeRepo.html#OstreeRepoPullFlags" title="enum OstreeRepoPullFlags"><span class="type">OstreeRepoPullFlags</span></a> flags</code></em>,
|
||||||
<em class="parameter"><code><a class="link" href="ostree-Simple-upgrade-class.html#OstreeSysrootUpgraderPullFlags" title="enum OstreeSysrootUpgraderPullFlags"><span class="type">OstreeSysrootUpgraderPullFlags</span></a> upgrader_flags</code></em>,
|
<em class="parameter"><code><a class="link" href="ostree-Simple-upgrade-class.html#OstreeSysrootUpgraderPullFlags" title="enum OstreeSysrootUpgraderPullFlags"><span class="type">OstreeSysrootUpgraderPullFlags</span></a> upgrader_flags</code></em>,
|
||||||
<em class="parameter"><code><a class="link" href="ostree-Progress-notification-system-for-asynchronous-operations.html#OstreeAsyncProgress" title="OstreeAsyncProgress"><span class="type">OstreeAsyncProgress</span></a> *progress</code></em>,
|
<em class="parameter"><code><a class="link" href="ostree-Progress-notification-system-for-asynchronous-operations.html#OstreeAsyncProgress" title="OstreeAsyncProgress"><span class="type">OstreeAsyncProgress</span></a> *progress</code></em>,
|
||||||
<em class="parameter"><code><span class="type">gboolean</span> *out_changed</code></em>,
|
<em class="parameter"><code><span class="type">gboolean</span> *out_changed</code></em>,
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="function_type">
|
<td class="function_type">
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="returnvalue">OstreeRepo</span></a> *
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="returnvalue">OstreeRepo</span></a> *
|
||||||
</td>
|
</td>
|
||||||
<td class="function_name">
|
<td class="function_name">
|
||||||
<a class="link" href="ostree-ostree-repo-file.html#ostree-repo-file-get-repo" title="ostree_repo_file_get_repo ()">ostree_repo_file_get_repo</a> <span class="c_punctuation">()</span>
|
<a class="link" href="ostree-ostree-repo-file.html#ostree-repo-file-get-repo" title="ostree_repo_file_get_repo ()">ostree_repo_file_get_repo</a> <span class="c_punctuation">()</span>
|
||||||
|
|
@ -170,7 +170,7 @@ ostree_repo_file_get_xattrs (<em class="parameter"><code><a class="link" href="o
|
||||||
<hr>
|
<hr>
|
||||||
<div class="refsect2">
|
<div class="refsect2">
|
||||||
<a name="ostree-repo-file-get-repo"></a><h3>ostree_repo_file_get_repo ()</h3>
|
<a name="ostree-repo-file-get-repo"></a><h3>ostree_repo_file_get_repo ()</h3>
|
||||||
<pre class="programlisting"><a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo"><span class="returnvalue">OstreeRepo</span></a> *
|
<pre class="programlisting"><a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo"><span class="returnvalue">OstreeRepo</span></a> *
|
||||||
ostree_repo_file_get_repo (<em class="parameter"><code><a class="link" href="ostree-ostree-repo-file.html#OstreeRepoFile" title="OstreeRepoFile"><span class="type">OstreeRepoFile</span></a> *self</code></em>);</pre>
|
ostree_repo_file_get_repo (<em class="parameter"><code><a class="link" href="ostree-ostree-repo-file.html#OstreeRepoFile" title="OstreeRepoFile"><span class="type">OstreeRepoFile</span></a> *self</code></em>);</pre>
|
||||||
<div class="refsect3">
|
<div class="refsect3">
|
||||||
<a name="ostree-repo-file-get-repo.returns"></a><h4>Returns</h4>
|
<a name="ostree-repo-file-get-repo.returns"></a><h4>Returns</h4>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<chapters>
|
<chapters>
|
||||||
<sub name="API Reference" link="reference.html">
|
<sub name="API Reference" link="reference.html">
|
||||||
<sub name="Core repository-independent functions" link="ostree-Core-repository-independent-functions.html"/>
|
<sub name="Core repository-independent functions" link="ostree-Core-repository-independent-functions.html"/>
|
||||||
<sub name="Content-addressed object store" link="ostree-Content-addressed-object-store.html"/>
|
<sub name="OstreeRepo: Content-addressed object store" link="ostree-OstreeRepo.html"/>
|
||||||
<sub name="In-memory modifiable filesystem tree" link="ostree-In-memory-modifiable-filesystem-tree.html"/>
|
<sub name="In-memory modifiable filesystem tree" link="ostree-In-memory-modifiable-filesystem-tree.html"/>
|
||||||
<sub name="Root partition mount point" link="ostree-Root-partition-mount-point.html"/>
|
<sub name="Root partition mount point" link="ostree-Root-partition-mount-point.html"/>
|
||||||
<sub name="Progress notification system for asynchronous operations" link="ostree-Progress-notification-system-for-asynchronous-operations.html"/>
|
<sub name="Progress notification system for asynchronous operations" link="ostree-Progress-notification-system-for-asynchronous-operations.html"/>
|
||||||
|
|
@ -81,150 +81,150 @@
|
||||||
<keyword type="macro" name="OSTREE_COMMIT_GVARIANT_FORMAT" link="ostree-Core-repository-independent-functions.html#OSTREE-COMMIT-GVARIANT-FORMAT:CAPS"/>
|
<keyword type="macro" name="OSTREE_COMMIT_GVARIANT_FORMAT" link="ostree-Core-repository-independent-functions.html#OSTREE-COMMIT-GVARIANT-FORMAT:CAPS"/>
|
||||||
<keyword type="macro" name="OSTREE_SUMMARY_GVARIANT_STRING" link="ostree-Core-repository-independent-functions.html#OSTREE-SUMMARY-GVARIANT-STRING:CAPS"/>
|
<keyword type="macro" name="OSTREE_SUMMARY_GVARIANT_STRING" link="ostree-Core-repository-independent-functions.html#OSTREE-SUMMARY-GVARIANT-STRING:CAPS"/>
|
||||||
<keyword type="macro" name="OSTREE_SUMMARY_GVARIANT_FORMAT" link="ostree-Core-repository-independent-functions.html#OSTREE-SUMMARY-GVARIANT-FORMAT:CAPS"/>
|
<keyword type="macro" name="OSTREE_SUMMARY_GVARIANT_FORMAT" link="ostree-Core-repository-independent-functions.html#OSTREE-SUMMARY-GVARIANT-FORMAT:CAPS"/>
|
||||||
<keyword type="function" name="ostree_repo_mode_from_string ()" link="ostree-Content-addressed-object-store.html#ostree-repo-mode-from-string"/>
|
<keyword type="function" name="ostree_repo_mode_from_string ()" link="ostree-OstreeRepo.html#ostree-repo-mode-from-string"/>
|
||||||
<keyword type="function" name="ostree_repo_open_at ()" link="ostree-Content-addressed-object-store.html#ostree-repo-open-at"/>
|
<keyword type="function" name="ostree_repo_open_at ()" link="ostree-OstreeRepo.html#ostree-repo-open-at"/>
|
||||||
<keyword type="function" name="ostree_repo_new ()" link="ostree-Content-addressed-object-store.html#ostree-repo-new"/>
|
<keyword type="function" name="ostree_repo_new ()" link="ostree-OstreeRepo.html#ostree-repo-new"/>
|
||||||
<keyword type="function" name="ostree_repo_new_for_sysroot_path ()" link="ostree-Content-addressed-object-store.html#ostree-repo-new-for-sysroot-path"/>
|
<keyword type="function" name="ostree_repo_new_for_sysroot_path ()" link="ostree-OstreeRepo.html#ostree-repo-new-for-sysroot-path"/>
|
||||||
<keyword type="function" name="ostree_repo_new_default ()" link="ostree-Content-addressed-object-store.html#ostree-repo-new-default"/>
|
<keyword type="function" name="ostree_repo_new_default ()" link="ostree-OstreeRepo.html#ostree-repo-new-default"/>
|
||||||
<keyword type="function" name="ostree_repo_open ()" link="ostree-Content-addressed-object-store.html#ostree-repo-open"/>
|
<keyword type="function" name="ostree_repo_open ()" link="ostree-OstreeRepo.html#ostree-repo-open"/>
|
||||||
<keyword type="function" name="ostree_repo_set_disable_fsync ()" link="ostree-Content-addressed-object-store.html#ostree-repo-set-disable-fsync"/>
|
<keyword type="function" name="ostree_repo_set_disable_fsync ()" link="ostree-OstreeRepo.html#ostree-repo-set-disable-fsync"/>
|
||||||
<keyword type="function" name="ostree_repo_get_disable_fsync ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-disable-fsync"/>
|
<keyword type="function" name="ostree_repo_get_disable_fsync ()" link="ostree-OstreeRepo.html#ostree-repo-get-disable-fsync"/>
|
||||||
<keyword type="function" name="ostree_repo_is_system ()" link="ostree-Content-addressed-object-store.html#ostree-repo-is-system"/>
|
<keyword type="function" name="ostree_repo_is_system ()" link="ostree-OstreeRepo.html#ostree-repo-is-system"/>
|
||||||
<keyword type="function" name="ostree_repo_is_writable ()" link="ostree-Content-addressed-object-store.html#ostree-repo-is-writable"/>
|
<keyword type="function" name="ostree_repo_is_writable ()" link="ostree-OstreeRepo.html#ostree-repo-is-writable"/>
|
||||||
<keyword type="function" name="ostree_repo_create_at ()" link="ostree-Content-addressed-object-store.html#ostree-repo-create-at"/>
|
<keyword type="function" name="ostree_repo_create_at ()" link="ostree-OstreeRepo.html#ostree-repo-create-at"/>
|
||||||
<keyword type="function" name="ostree_repo_create ()" link="ostree-Content-addressed-object-store.html#ostree-repo-create"/>
|
<keyword type="function" name="ostree_repo_create ()" link="ostree-OstreeRepo.html#ostree-repo-create"/>
|
||||||
<keyword type="function" name="ostree_repo_get_path ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-path"/>
|
<keyword type="function" name="ostree_repo_get_path ()" link="ostree-OstreeRepo.html#ostree-repo-get-path"/>
|
||||||
<keyword type="function" name="ostree_repo_get_mode ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-mode"/>
|
<keyword type="function" name="ostree_repo_get_mode ()" link="ostree-OstreeRepo.html#ostree-repo-get-mode"/>
|
||||||
<keyword type="function" name="ostree_repo_get_config ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-config"/>
|
<keyword type="function" name="ostree_repo_get_config ()" link="ostree-OstreeRepo.html#ostree-repo-get-config"/>
|
||||||
<keyword type="function" name="ostree_repo_get_dfd ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-dfd"/>
|
<keyword type="function" name="ostree_repo_get_dfd ()" link="ostree-OstreeRepo.html#ostree-repo-get-dfd"/>
|
||||||
<keyword type="function" name="ostree_repo_copy_config ()" link="ostree-Content-addressed-object-store.html#ostree-repo-copy-config"/>
|
<keyword type="function" name="ostree_repo_copy_config ()" link="ostree-OstreeRepo.html#ostree-repo-copy-config"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_add ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-add"/>
|
<keyword type="function" name="ostree_repo_remote_add ()" link="ostree-OstreeRepo.html#ostree-repo-remote-add"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_delete ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-delete"/>
|
<keyword type="function" name="ostree_repo_remote_delete ()" link="ostree-OstreeRepo.html#ostree-repo-remote-delete"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_change ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-change"/>
|
<keyword type="function" name="ostree_repo_remote_change ()" link="ostree-OstreeRepo.html#ostree-repo-remote-change"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_list ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-list"/>
|
<keyword type="function" name="ostree_repo_remote_list ()" link="ostree-OstreeRepo.html#ostree-repo-remote-list"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_get_url ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-get-url"/>
|
<keyword type="function" name="ostree_repo_remote_get_url ()" link="ostree-OstreeRepo.html#ostree-repo-remote-get-url"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_get_gpg_verify ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-get-gpg-verify"/>
|
<keyword type="function" name="ostree_repo_remote_get_gpg_verify ()" link="ostree-OstreeRepo.html#ostree-repo-remote-get-gpg-verify"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_get_gpg_verify_summary ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-get-gpg-verify-summary"/>
|
<keyword type="function" name="ostree_repo_remote_get_gpg_verify_summary ()" link="ostree-OstreeRepo.html#ostree-repo-remote-get-gpg-verify-summary"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_gpg_import ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-gpg-import"/>
|
<keyword type="function" name="ostree_repo_remote_gpg_import ()" link="ostree-OstreeRepo.html#ostree-repo-remote-gpg-import"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_fetch_summary ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-fetch-summary"/>
|
<keyword type="function" name="ostree_repo_remote_fetch_summary ()" link="ostree-OstreeRepo.html#ostree-repo-remote-fetch-summary"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_fetch_summary_with_options ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-fetch-summary-with-options"/>
|
<keyword type="function" name="ostree_repo_remote_fetch_summary_with_options ()" link="ostree-OstreeRepo.html#ostree-repo-remote-fetch-summary-with-options"/>
|
||||||
<keyword type="function" name="ostree_repo_reload_config ()" link="ostree-Content-addressed-object-store.html#ostree-repo-reload-config"/>
|
<keyword type="function" name="ostree_repo_reload_config ()" link="ostree-OstreeRepo.html#ostree-repo-reload-config"/>
|
||||||
<keyword type="function" name="ostree_repo_get_remote_boolean_option ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-remote-boolean-option"/>
|
<keyword type="function" name="ostree_repo_get_remote_boolean_option ()" link="ostree-OstreeRepo.html#ostree-repo-get-remote-boolean-option"/>
|
||||||
<keyword type="function" name="ostree_repo_get_remote_list_option ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-remote-list-option"/>
|
<keyword type="function" name="ostree_repo_get_remote_list_option ()" link="ostree-OstreeRepo.html#ostree-repo-get-remote-list-option"/>
|
||||||
<keyword type="function" name="ostree_repo_get_remote_option ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-remote-option"/>
|
<keyword type="function" name="ostree_repo_get_remote_option ()" link="ostree-OstreeRepo.html#ostree-repo-get-remote-option"/>
|
||||||
<keyword type="function" name="ostree_repo_get_parent ()" link="ostree-Content-addressed-object-store.html#ostree-repo-get-parent"/>
|
<keyword type="function" name="ostree_repo_get_parent ()" link="ostree-OstreeRepo.html#ostree-repo-get-parent"/>
|
||||||
<keyword type="function" name="ostree_repo_write_config ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-config"/>
|
<keyword type="function" name="ostree_repo_write_config ()" link="ostree-OstreeRepo.html#ostree-repo-write-config"/>
|
||||||
<keyword type="function" name="ostree_repo_scan_hardlinks ()" link="ostree-Content-addressed-object-store.html#ostree-repo-scan-hardlinks"/>
|
<keyword type="function" name="ostree_repo_scan_hardlinks ()" link="ostree-OstreeRepo.html#ostree-repo-scan-hardlinks"/>
|
||||||
<keyword type="function" name="ostree_repo_prepare_transaction ()" link="ostree-Content-addressed-object-store.html#ostree-repo-prepare-transaction"/>
|
<keyword type="function" name="ostree_repo_prepare_transaction ()" link="ostree-OstreeRepo.html#ostree-repo-prepare-transaction"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_transaction ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-transaction"/>
|
<keyword type="function" name="ostree_repo_commit_transaction ()" link="ostree-OstreeRepo.html#ostree-repo-commit-transaction"/>
|
||||||
<keyword type="function" name="ostree_repo_abort_transaction ()" link="ostree-Content-addressed-object-store.html#ostree-repo-abort-transaction"/>
|
<keyword type="function" name="ostree_repo_abort_transaction ()" link="ostree-OstreeRepo.html#ostree-repo-abort-transaction"/>
|
||||||
<keyword type="function" name="ostree_repo_transaction_set_refspec ()" link="ostree-Content-addressed-object-store.html#ostree-repo-transaction-set-refspec"/>
|
<keyword type="function" name="ostree_repo_transaction_set_refspec ()" link="ostree-OstreeRepo.html#ostree-repo-transaction-set-refspec"/>
|
||||||
<keyword type="function" name="ostree_repo_transaction_set_ref ()" link="ostree-Content-addressed-object-store.html#ostree-repo-transaction-set-ref"/>
|
<keyword type="function" name="ostree_repo_transaction_set_ref ()" link="ostree-OstreeRepo.html#ostree-repo-transaction-set-ref"/>
|
||||||
<keyword type="function" name="ostree_repo_set_ref_immediate ()" link="ostree-Content-addressed-object-store.html#ostree-repo-set-ref-immediate"/>
|
<keyword type="function" name="ostree_repo_set_ref_immediate ()" link="ostree-OstreeRepo.html#ostree-repo-set-ref-immediate"/>
|
||||||
<keyword type="function" name="ostree_repo_set_alias_ref_immediate ()" link="ostree-Content-addressed-object-store.html#ostree-repo-set-alias-ref-immediate"/>
|
<keyword type="function" name="ostree_repo_set_alias_ref_immediate ()" link="ostree-OstreeRepo.html#ostree-repo-set-alias-ref-immediate"/>
|
||||||
<keyword type="function" name="ostree_repo_set_cache_dir ()" link="ostree-Content-addressed-object-store.html#ostree-repo-set-cache-dir"/>
|
<keyword type="function" name="ostree_repo_set_cache_dir ()" link="ostree-OstreeRepo.html#ostree-repo-set-cache-dir"/>
|
||||||
<keyword type="function" name="ostree_repo_sign_delta ()" link="ostree-Content-addressed-object-store.html#ostree-repo-sign-delta"/>
|
<keyword type="function" name="ostree_repo_sign_delta ()" link="ostree-OstreeRepo.html#ostree-repo-sign-delta"/>
|
||||||
<keyword type="function" name="ostree_repo_has_object ()" link="ostree-Content-addressed-object-store.html#ostree-repo-has-object"/>
|
<keyword type="function" name="ostree_repo_has_object ()" link="ostree-OstreeRepo.html#ostree-repo-has-object"/>
|
||||||
<keyword type="function" name="ostree_repo_write_metadata ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata"/>
|
<keyword type="function" name="ostree_repo_write_metadata ()" link="ostree-OstreeRepo.html#ostree-repo-write-metadata"/>
|
||||||
<keyword type="function" name="ostree_repo_write_metadata_async ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata-async"/>
|
<keyword type="function" name="ostree_repo_write_metadata_async ()" link="ostree-OstreeRepo.html#ostree-repo-write-metadata-async"/>
|
||||||
<keyword type="function" name="ostree_repo_write_metadata_finish ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata-finish"/>
|
<keyword type="function" name="ostree_repo_write_metadata_finish ()" link="ostree-OstreeRepo.html#ostree-repo-write-metadata-finish"/>
|
||||||
<keyword type="function" name="ostree_repo_write_content ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-content"/>
|
<keyword type="function" name="ostree_repo_write_content ()" link="ostree-OstreeRepo.html#ostree-repo-write-content"/>
|
||||||
<keyword type="function" name="ostree_repo_write_metadata_trusted ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata-trusted"/>
|
<keyword type="function" name="ostree_repo_write_metadata_trusted ()" link="ostree-OstreeRepo.html#ostree-repo-write-metadata-trusted"/>
|
||||||
<keyword type="function" name="ostree_repo_write_metadata_stream_trusted ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata-stream-trusted"/>
|
<keyword type="function" name="ostree_repo_write_metadata_stream_trusted ()" link="ostree-OstreeRepo.html#ostree-repo-write-metadata-stream-trusted"/>
|
||||||
<keyword type="function" name="ostree_repo_write_content_trusted ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-content-trusted"/>
|
<keyword type="function" name="ostree_repo_write_content_trusted ()" link="ostree-OstreeRepo.html#ostree-repo-write-content-trusted"/>
|
||||||
<keyword type="function" name="ostree_repo_write_content_async ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-content-async"/>
|
<keyword type="function" name="ostree_repo_write_content_async ()" link="ostree-OstreeRepo.html#ostree-repo-write-content-async"/>
|
||||||
<keyword type="function" name="ostree_repo_write_content_finish ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-content-finish"/>
|
<keyword type="function" name="ostree_repo_write_content_finish ()" link="ostree-OstreeRepo.html#ostree-repo-write-content-finish"/>
|
||||||
<keyword type="function" name="ostree_repo_resolve_rev ()" link="ostree-Content-addressed-object-store.html#ostree-repo-resolve-rev"/>
|
<keyword type="function" name="ostree_repo_resolve_rev ()" link="ostree-OstreeRepo.html#ostree-repo-resolve-rev"/>
|
||||||
<keyword type="function" name="ostree_repo_resolve_rev_ext ()" link="ostree-Content-addressed-object-store.html#ostree-repo-resolve-rev-ext"/>
|
<keyword type="function" name="ostree_repo_resolve_rev_ext ()" link="ostree-OstreeRepo.html#ostree-repo-resolve-rev-ext"/>
|
||||||
<keyword type="function" name="ostree_repo_list_refs ()" link="ostree-Content-addressed-object-store.html#ostree-repo-list-refs"/>
|
<keyword type="function" name="ostree_repo_list_refs ()" link="ostree-OstreeRepo.html#ostree-repo-list-refs"/>
|
||||||
<keyword type="function" name="ostree_repo_list_refs_ext ()" link="ostree-Content-addressed-object-store.html#ostree-repo-list-refs-ext"/>
|
<keyword type="function" name="ostree_repo_list_refs_ext ()" link="ostree-OstreeRepo.html#ostree-repo-list-refs-ext"/>
|
||||||
<keyword type="function" name="ostree_repo_remote_list_refs ()" link="ostree-Content-addressed-object-store.html#ostree-repo-remote-list-refs"/>
|
<keyword type="function" name="ostree_repo_remote_list_refs ()" link="ostree-OstreeRepo.html#ostree-repo-remote-list-refs"/>
|
||||||
<keyword type="function" name="ostree_repo_load_variant ()" link="ostree-Content-addressed-object-store.html#ostree-repo-load-variant"/>
|
<keyword type="function" name="ostree_repo_load_variant ()" link="ostree-OstreeRepo.html#ostree-repo-load-variant"/>
|
||||||
<keyword type="function" name="ostree_repo_load_commit ()" link="ostree-Content-addressed-object-store.html#ostree-repo-load-commit"/>
|
<keyword type="function" name="ostree_repo_load_commit ()" link="ostree-OstreeRepo.html#ostree-repo-load-commit"/>
|
||||||
<keyword type="function" name="ostree_repo_load_variant_if_exists ()" link="ostree-Content-addressed-object-store.html#ostree-repo-load-variant-if-exists"/>
|
<keyword type="function" name="ostree_repo_load_variant_if_exists ()" link="ostree-OstreeRepo.html#ostree-repo-load-variant-if-exists"/>
|
||||||
<keyword type="function" name="ostree_repo_load_file ()" link="ostree-Content-addressed-object-store.html#ostree-repo-load-file"/>
|
<keyword type="function" name="ostree_repo_load_file ()" link="ostree-OstreeRepo.html#ostree-repo-load-file"/>
|
||||||
<keyword type="function" name="ostree_repo_load_object_stream ()" link="ostree-Content-addressed-object-store.html#ostree-repo-load-object-stream"/>
|
<keyword type="function" name="ostree_repo_load_object_stream ()" link="ostree-OstreeRepo.html#ostree-repo-load-object-stream"/>
|
||||||
<keyword type="function" name="ostree_repo_query_object_storage_size ()" link="ostree-Content-addressed-object-store.html#ostree-repo-query-object-storage-size"/>
|
<keyword type="function" name="ostree_repo_query_object_storage_size ()" link="ostree-OstreeRepo.html#ostree-repo-query-object-storage-size"/>
|
||||||
<keyword type="function" name="ostree_repo_import_object_from ()" link="ostree-Content-addressed-object-store.html#ostree-repo-import-object-from"/>
|
<keyword type="function" name="ostree_repo_import_object_from ()" link="ostree-OstreeRepo.html#ostree-repo-import-object-from"/>
|
||||||
<keyword type="function" name="ostree_repo_import_object_from_with_trust ()" link="ostree-Content-addressed-object-store.html#ostree-repo-import-object-from-with-trust"/>
|
<keyword type="function" name="ostree_repo_import_object_from_with_trust ()" link="ostree-OstreeRepo.html#ostree-repo-import-object-from-with-trust"/>
|
||||||
<keyword type="function" name="ostree_repo_import_archive_to_mtree ()" link="ostree-Content-addressed-object-store.html#ostree-repo-import-archive-to-mtree"/>
|
<keyword type="function" name="ostree_repo_import_archive_to_mtree ()" link="ostree-OstreeRepo.html#ostree-repo-import-archive-to-mtree"/>
|
||||||
<keyword type="function" name="ostree_repo_export_tree_to_archive ()" link="ostree-Content-addressed-object-store.html#ostree-repo-export-tree-to-archive"/>
|
<keyword type="function" name="ostree_repo_export_tree_to_archive ()" link="ostree-OstreeRepo.html#ostree-repo-export-tree-to-archive"/>
|
||||||
<keyword type="function" name="ostree_repo_delete_object ()" link="ostree-Content-addressed-object-store.html#ostree-repo-delete-object"/>
|
<keyword type="function" name="ostree_repo_delete_object ()" link="ostree-OstreeRepo.html#ostree-repo-delete-object"/>
|
||||||
<keyword type="function" name="OstreeRepoCommitFilter ()" link="ostree-Content-addressed-object-store.html#OstreeRepoCommitFilter"/>
|
<keyword type="function" name="OstreeRepoCommitFilter ()" link="ostree-OstreeRepo.html#OstreeRepoCommitFilter"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_modifier_new ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-new"/>
|
<keyword type="function" name="ostree_repo_commit_modifier_new ()" link="ostree-OstreeRepo.html#ostree-repo-commit-modifier-new"/>
|
||||||
<keyword type="function" name="OstreeRepoCommitModifierXattrCallback ()" link="ostree-Content-addressed-object-store.html#OstreeRepoCommitModifierXattrCallback"/>
|
<keyword type="function" name="OstreeRepoCommitModifierXattrCallback ()" link="ostree-OstreeRepo.html#OstreeRepoCommitModifierXattrCallback"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_modifier_set_xattr_callback ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-set-xattr-callback"/>
|
<keyword type="function" name="ostree_repo_commit_modifier_set_xattr_callback ()" link="ostree-OstreeRepo.html#ostree-repo-commit-modifier-set-xattr-callback"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_modifier_set_sepolicy ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-set-sepolicy"/>
|
<keyword type="function" name="ostree_repo_commit_modifier_set_sepolicy ()" link="ostree-OstreeRepo.html#ostree-repo-commit-modifier-set-sepolicy"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_modifier_set_devino_cache ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-set-devino-cache"/>
|
<keyword type="function" name="ostree_repo_commit_modifier_set_devino_cache ()" link="ostree-OstreeRepo.html#ostree-repo-commit-modifier-set-devino-cache"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_modifier_ref ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-ref"/>
|
<keyword type="function" name="ostree_repo_commit_modifier_ref ()" link="ostree-OstreeRepo.html#ostree-repo-commit-modifier-ref"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_modifier_unref ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-unref"/>
|
<keyword type="function" name="ostree_repo_commit_modifier_unref ()" link="ostree-OstreeRepo.html#ostree-repo-commit-modifier-unref"/>
|
||||||
<keyword type="function" name="ostree_repo_devino_cache_new ()" link="ostree-Content-addressed-object-store.html#ostree-repo-devino-cache-new"/>
|
<keyword type="function" name="ostree_repo_devino_cache_new ()" link="ostree-OstreeRepo.html#ostree-repo-devino-cache-new"/>
|
||||||
<keyword type="function" name="ostree_repo_devino_cache_ref ()" link="ostree-Content-addressed-object-store.html#ostree-repo-devino-cache-ref"/>
|
<keyword type="function" name="ostree_repo_devino_cache_ref ()" link="ostree-OstreeRepo.html#ostree-repo-devino-cache-ref"/>
|
||||||
<keyword type="function" name="ostree_repo_devino_cache_unref ()" link="ostree-Content-addressed-object-store.html#ostree-repo-devino-cache-unref"/>
|
<keyword type="function" name="ostree_repo_devino_cache_unref ()" link="ostree-OstreeRepo.html#ostree-repo-devino-cache-unref"/>
|
||||||
<keyword type="function" name="ostree_repo_devino_cache_get_type ()" link="ostree-Content-addressed-object-store.html#ostree-repo-devino-cache-get-type"/>
|
<keyword type="function" name="ostree_repo_devino_cache_get_type ()" link="ostree-OstreeRepo.html#ostree-repo-devino-cache-get-type"/>
|
||||||
<keyword type="function" name="ostree_repo_write_directory_to_mtree ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-directory-to-mtree"/>
|
<keyword type="function" name="ostree_repo_write_directory_to_mtree ()" link="ostree-OstreeRepo.html#ostree-repo-write-directory-to-mtree"/>
|
||||||
<keyword type="function" name="ostree_repo_write_dfd_to_mtree ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-dfd-to-mtree"/>
|
<keyword type="function" name="ostree_repo_write_dfd_to_mtree ()" link="ostree-OstreeRepo.html#ostree-repo-write-dfd-to-mtree"/>
|
||||||
<keyword type="function" name="ostree_repo_write_archive_to_mtree ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-archive-to-mtree"/>
|
<keyword type="function" name="ostree_repo_write_archive_to_mtree ()" link="ostree-OstreeRepo.html#ostree-repo-write-archive-to-mtree"/>
|
||||||
<keyword type="function" name="ostree_repo_write_mtree ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-mtree"/>
|
<keyword type="function" name="ostree_repo_write_mtree ()" link="ostree-OstreeRepo.html#ostree-repo-write-mtree"/>
|
||||||
<keyword type="function" name="ostree_repo_write_commit ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-commit"/>
|
<keyword type="function" name="ostree_repo_write_commit ()" link="ostree-OstreeRepo.html#ostree-repo-write-commit"/>
|
||||||
<keyword type="function" name="ostree_repo_write_commit_with_time ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-commit-with-time"/>
|
<keyword type="function" name="ostree_repo_write_commit_with_time ()" link="ostree-OstreeRepo.html#ostree-repo-write-commit-with-time"/>
|
||||||
<keyword type="function" name="ostree_repo_read_commit_detached_metadata ()" link="ostree-Content-addressed-object-store.html#ostree-repo-read-commit-detached-metadata"/>
|
<keyword type="function" name="ostree_repo_read_commit_detached_metadata ()" link="ostree-OstreeRepo.html#ostree-repo-read-commit-detached-metadata"/>
|
||||||
<keyword type="function" name="ostree_repo_write_commit_detached_metadata ()" link="ostree-Content-addressed-object-store.html#ostree-repo-write-commit-detached-metadata"/>
|
<keyword type="function" name="ostree_repo_write_commit_detached_metadata ()" link="ostree-OstreeRepo.html#ostree-repo-write-commit-detached-metadata"/>
|
||||||
<keyword type="function" name="ostree_repo_checkout_tree ()" link="ostree-Content-addressed-object-store.html#ostree-repo-checkout-tree"/>
|
<keyword type="function" name="ostree_repo_checkout_tree ()" link="ostree-OstreeRepo.html#ostree-repo-checkout-tree"/>
|
||||||
<keyword type="function" name="ostree_repo_checkout_tree_at ()" link="ostree-Content-addressed-object-store.html#ostree-repo-checkout-tree-at" deprecated=""/>
|
<keyword type="function" name="ostree_repo_checkout_tree_at ()" link="ostree-OstreeRepo.html#ostree-repo-checkout-tree-at" deprecated=""/>
|
||||||
<keyword type="function" name="ostree_repo_checkout_at ()" link="ostree-Content-addressed-object-store.html#ostree-repo-checkout-at"/>
|
<keyword type="function" name="ostree_repo_checkout_at ()" link="ostree-OstreeRepo.html#ostree-repo-checkout-at"/>
|
||||||
<keyword type="function" name="ostree_repo_checkout_gc ()" link="ostree-Content-addressed-object-store.html#ostree-repo-checkout-gc"/>
|
<keyword type="function" name="ostree_repo_checkout_gc ()" link="ostree-OstreeRepo.html#ostree-repo-checkout-gc"/>
|
||||||
<keyword type="function" name="ostree_repo_read_commit ()" link="ostree-Content-addressed-object-store.html#ostree-repo-read-commit"/>
|
<keyword type="function" name="ostree_repo_read_commit ()" link="ostree-OstreeRepo.html#ostree-repo-read-commit"/>
|
||||||
<keyword type="function" name="ostree_repo_list_objects ()" link="ostree-Content-addressed-object-store.html#ostree-repo-list-objects"/>
|
<keyword type="function" name="ostree_repo_list_objects ()" link="ostree-OstreeRepo.html#ostree-repo-list-objects"/>
|
||||||
<keyword type="function" name="ostree_repo_list_commit_objects_starting_with ()" link="ostree-Content-addressed-object-store.html#ostree-repo-list-commit-objects-starting-with"/>
|
<keyword type="function" name="ostree_repo_list_commit_objects_starting_with ()" link="ostree-OstreeRepo.html#ostree-repo-list-commit-objects-starting-with"/>
|
||||||
<keyword type="function" name="ostree_repo_list_static_delta_names ()" link="ostree-Content-addressed-object-store.html#ostree-repo-list-static-delta-names"/>
|
<keyword type="function" name="ostree_repo_list_static_delta_names ()" link="ostree-OstreeRepo.html#ostree-repo-list-static-delta-names"/>
|
||||||
<keyword type="function" name="ostree_repo_static_delta_generate ()" link="ostree-Content-addressed-object-store.html#ostree-repo-static-delta-generate"/>
|
<keyword type="function" name="ostree_repo_static_delta_generate ()" link="ostree-OstreeRepo.html#ostree-repo-static-delta-generate"/>
|
||||||
<keyword type="function" name="ostree_repo_static_delta_execute_offline ()" link="ostree-Content-addressed-object-store.html#ostree-repo-static-delta-execute-offline"/>
|
<keyword type="function" name="ostree_repo_static_delta_execute_offline ()" link="ostree-OstreeRepo.html#ostree-repo-static-delta-execute-offline"/>
|
||||||
<keyword type="function" name="ostree_repo_traverse_new_reachable ()" link="ostree-Content-addressed-object-store.html#ostree-repo-traverse-new-reachable"/>
|
<keyword type="function" name="ostree_repo_traverse_new_reachable ()" link="ostree-OstreeRepo.html#ostree-repo-traverse-new-reachable"/>
|
||||||
<keyword type="function" name="ostree_repo_traverse_commit ()" link="ostree-Content-addressed-object-store.html#ostree-repo-traverse-commit"/>
|
<keyword type="function" name="ostree_repo_traverse_commit ()" link="ostree-OstreeRepo.html#ostree-repo-traverse-commit"/>
|
||||||
<keyword type="function" name="ostree_repo_traverse_commit_union ()" link="ostree-Content-addressed-object-store.html#ostree-repo-traverse-commit-union"/>
|
<keyword type="function" name="ostree_repo_traverse_commit_union ()" link="ostree-OstreeRepo.html#ostree-repo-traverse-commit-union"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_traverse_iter_cleanup ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-cleanup"/>
|
<keyword type="function" name="ostree_repo_commit_traverse_iter_cleanup ()" link="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-cleanup"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_traverse_iter_clear ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-clear"/>
|
<keyword type="function" name="ostree_repo_commit_traverse_iter_clear ()" link="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-clear"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_traverse_iter_get_dir ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-get-dir"/>
|
<keyword type="function" name="ostree_repo_commit_traverse_iter_get_dir ()" link="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-get-dir"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_traverse_iter_get_file ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-get-file"/>
|
<keyword type="function" name="ostree_repo_commit_traverse_iter_get_file ()" link="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-get-file"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_traverse_iter_init_commit ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-init-commit"/>
|
<keyword type="function" name="ostree_repo_commit_traverse_iter_init_commit ()" link="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-init-commit"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_traverse_iter_init_dirtree ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-init-dirtree"/>
|
<keyword type="function" name="ostree_repo_commit_traverse_iter_init_dirtree ()" link="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-init-dirtree"/>
|
||||||
<keyword type="function" name="ostree_repo_commit_traverse_iter_next ()" link="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-next"/>
|
<keyword type="function" name="ostree_repo_commit_traverse_iter_next ()" link="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-next"/>
|
||||||
<keyword type="function" name="ostree_repo_prune ()" link="ostree-Content-addressed-object-store.html#ostree-repo-prune"/>
|
<keyword type="function" name="ostree_repo_prune ()" link="ostree-OstreeRepo.html#ostree-repo-prune"/>
|
||||||
<keyword type="function" name="ostree_repo_prune_static_deltas ()" link="ostree-Content-addressed-object-store.html#ostree-repo-prune-static-deltas"/>
|
<keyword type="function" name="ostree_repo_prune_static_deltas ()" link="ostree-OstreeRepo.html#ostree-repo-prune-static-deltas"/>
|
||||||
<keyword type="function" name="ostree_repo_prune_from_reachable ()" link="ostree-Content-addressed-object-store.html#ostree-repo-prune-from-reachable"/>
|
<keyword type="function" name="ostree_repo_prune_from_reachable ()" link="ostree-OstreeRepo.html#ostree-repo-prune-from-reachable"/>
|
||||||
<keyword type="function" name="ostree_repo_pull ()" link="ostree-Content-addressed-object-store.html#ostree-repo-pull"/>
|
<keyword type="function" name="ostree_repo_pull ()" link="ostree-OstreeRepo.html#ostree-repo-pull"/>
|
||||||
<keyword type="function" name="ostree_repo_pull_one_dir ()" link="ostree-Content-addressed-object-store.html#ostree-repo-pull-one-dir"/>
|
<keyword type="function" name="ostree_repo_pull_one_dir ()" link="ostree-OstreeRepo.html#ostree-repo-pull-one-dir"/>
|
||||||
<keyword type="function" name="ostree_repo_pull_with_options ()" link="ostree-Content-addressed-object-store.html#ostree-repo-pull-with-options"/>
|
<keyword type="function" name="ostree_repo_pull_with_options ()" link="ostree-OstreeRepo.html#ostree-repo-pull-with-options"/>
|
||||||
<keyword type="function" name="ostree_repo_pull_default_console_progress_changed ()" link="ostree-Content-addressed-object-store.html#ostree-repo-pull-default-console-progress-changed"/>
|
<keyword type="function" name="ostree_repo_pull_default_console_progress_changed ()" link="ostree-OstreeRepo.html#ostree-repo-pull-default-console-progress-changed"/>
|
||||||
<keyword type="function" name="ostree_repo_sign_commit ()" link="ostree-Content-addressed-object-store.html#ostree-repo-sign-commit"/>
|
<keyword type="function" name="ostree_repo_sign_commit ()" link="ostree-OstreeRepo.html#ostree-repo-sign-commit"/>
|
||||||
<keyword type="function" name="ostree_repo_append_gpg_signature ()" link="ostree-Content-addressed-object-store.html#ostree-repo-append-gpg-signature"/>
|
<keyword type="function" name="ostree_repo_append_gpg_signature ()" link="ostree-OstreeRepo.html#ostree-repo-append-gpg-signature"/>
|
||||||
<keyword type="function" name="ostree_repo_add_gpg_signature_summary ()" link="ostree-Content-addressed-object-store.html#ostree-repo-add-gpg-signature-summary"/>
|
<keyword type="function" name="ostree_repo_add_gpg_signature_summary ()" link="ostree-OstreeRepo.html#ostree-repo-add-gpg-signature-summary"/>
|
||||||
<keyword type="function" name="ostree_repo_gpg_verify_data ()" link="ostree-Content-addressed-object-store.html#ostree-repo-gpg-verify-data"/>
|
<keyword type="function" name="ostree_repo_gpg_verify_data ()" link="ostree-OstreeRepo.html#ostree-repo-gpg-verify-data"/>
|
||||||
<keyword type="function" name="ostree_repo_verify_commit ()" link="ostree-Content-addressed-object-store.html#ostree-repo-verify-commit"/>
|
<keyword type="function" name="ostree_repo_verify_commit ()" link="ostree-OstreeRepo.html#ostree-repo-verify-commit"/>
|
||||||
<keyword type="function" name="ostree_repo_verify_commit_ext ()" link="ostree-Content-addressed-object-store.html#ostree-repo-verify-commit-ext"/>
|
<keyword type="function" name="ostree_repo_verify_commit_ext ()" link="ostree-OstreeRepo.html#ostree-repo-verify-commit-ext"/>
|
||||||
<keyword type="function" name="ostree_repo_verify_commit_for_remote ()" link="ostree-Content-addressed-object-store.html#ostree-repo-verify-commit-for-remote"/>
|
<keyword type="function" name="ostree_repo_verify_commit_for_remote ()" link="ostree-OstreeRepo.html#ostree-repo-verify-commit-for-remote"/>
|
||||||
<keyword type="function" name="ostree_repo_verify_summary ()" link="ostree-Content-addressed-object-store.html#ostree-repo-verify-summary"/>
|
<keyword type="function" name="ostree_repo_verify_summary ()" link="ostree-OstreeRepo.html#ostree-repo-verify-summary"/>
|
||||||
<keyword type="function" name="ostree_repo_regenerate_summary ()" link="ostree-Content-addressed-object-store.html#ostree-repo-regenerate-summary"/>
|
<keyword type="function" name="ostree_repo_regenerate_summary ()" link="ostree-OstreeRepo.html#ostree-repo-regenerate-summary"/>
|
||||||
<keyword type="typedef" name="OstreeRepo" link="ostree-Content-addressed-object-store.html#OstreeRepo"/>
|
<keyword type="typedef" name="OstreeRepo" link="ostree-OstreeRepo.html#OstreeRepo"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoMode" link="ostree-Content-addressed-object-store.html#OstreeRepoMode"/>
|
<keyword type="enum" name="enum OstreeRepoMode" link="ostree-OstreeRepo.html#OstreeRepoMode"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoRemoteChange" link="ostree-Content-addressed-object-store.html#OstreeRepoRemoteChange"/>
|
<keyword type="enum" name="enum OstreeRepoRemoteChange" link="ostree-OstreeRepo.html#OstreeRepoRemoteChange"/>
|
||||||
<keyword type="struct" name="struct OstreeRepoTransactionStats" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats"/>
|
<keyword type="struct" name="struct OstreeRepoTransactionStats" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoResolveRevExtFlags" link="ostree-Content-addressed-object-store.html#OstreeRepoResolveRevExtFlags"/>
|
<keyword type="enum" name="enum OstreeRepoResolveRevExtFlags" link="ostree-OstreeRepo.html#OstreeRepoResolveRevExtFlags"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoListRefsExtFlags" link="ostree-Content-addressed-object-store.html#OstreeRepoListRefsExtFlags"/>
|
<keyword type="enum" name="enum OstreeRepoListRefsExtFlags" link="ostree-OstreeRepo.html#OstreeRepoListRefsExtFlags"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoCommitState" link="ostree-Content-addressed-object-store.html#OstreeRepoCommitState"/>
|
<keyword type="enum" name="enum OstreeRepoCommitState" link="ostree-OstreeRepo.html#OstreeRepoCommitState"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoCommitFilterResult" link="ostree-Content-addressed-object-store.html#OstreeRepoCommitFilterResult"/>
|
<keyword type="enum" name="enum OstreeRepoCommitFilterResult" link="ostree-OstreeRepo.html#OstreeRepoCommitFilterResult"/>
|
||||||
<keyword type="typedef" name="OstreeRepoCommitModifier" link="ostree-Content-addressed-object-store.html#OstreeRepoCommitModifier"/>
|
<keyword type="typedef" name="OstreeRepoCommitModifier" link="ostree-OstreeRepo.html#OstreeRepoCommitModifier"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoCommitModifierFlags" link="ostree-Content-addressed-object-store.html#OstreeRepoCommitModifierFlags"/>
|
<keyword type="enum" name="enum OstreeRepoCommitModifierFlags" link="ostree-OstreeRepo.html#OstreeRepoCommitModifierFlags"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoCheckoutMode" link="ostree-Content-addressed-object-store.html#OstreeRepoCheckoutMode"/>
|
<keyword type="enum" name="enum OstreeRepoCheckoutMode" link="ostree-OstreeRepo.html#OstreeRepoCheckoutMode"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoCheckoutOverwriteMode" link="ostree-Content-addressed-object-store.html#OstreeRepoCheckoutOverwriteMode"/>
|
<keyword type="enum" name="enum OstreeRepoCheckoutOverwriteMode" link="ostree-OstreeRepo.html#OstreeRepoCheckoutOverwriteMode"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoListObjectsFlags" link="ostree-Content-addressed-object-store.html#OstreeRepoListObjectsFlags"/>
|
<keyword type="enum" name="enum OstreeRepoListObjectsFlags" link="ostree-OstreeRepo.html#OstreeRepoListObjectsFlags"/>
|
||||||
<keyword type="macro" name="OSTREE_REPO_LIST_OBJECTS_VARIANT_TYPE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-LIST-OBJECTS-VARIANT-TYPE:CAPS"/>
|
<keyword type="macro" name="OSTREE_REPO_LIST_OBJECTS_VARIANT_TYPE" link="ostree-OstreeRepo.html#OSTREE-REPO-LIST-OBJECTS-VARIANT-TYPE:CAPS"/>
|
||||||
<keyword type="enum" name="enum OstreeStaticDeltaGenerateOpt" link="ostree-Content-addressed-object-store.html#OstreeStaticDeltaGenerateOpt"/>
|
<keyword type="enum" name="enum OstreeStaticDeltaGenerateOpt" link="ostree-OstreeRepo.html#OstreeStaticDeltaGenerateOpt"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoCommitTraverseFlags" link="ostree-Content-addressed-object-store.html#OstreeRepoCommitTraverseFlags"/>
|
<keyword type="enum" name="enum OstreeRepoCommitTraverseFlags" link="ostree-OstreeRepo.html#OstreeRepoCommitTraverseFlags"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoCommitIterResult" link="ostree-Content-addressed-object-store.html#OstreeRepoCommitIterResult"/>
|
<keyword type="enum" name="enum OstreeRepoCommitIterResult" link="ostree-OstreeRepo.html#OstreeRepoCommitIterResult"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoPruneFlags" link="ostree-Content-addressed-object-store.html#OstreeRepoPruneFlags"/>
|
<keyword type="enum" name="enum OstreeRepoPruneFlags" link="ostree-OstreeRepo.html#OstreeRepoPruneFlags"/>
|
||||||
<keyword type="enum" name="enum OstreeRepoPullFlags" link="ostree-Content-addressed-object-store.html#OstreeRepoPullFlags"/>
|
<keyword type="enum" name="enum OstreeRepoPullFlags" link="ostree-OstreeRepo.html#OstreeRepoPullFlags"/>
|
||||||
<keyword type="function" name="ostree_mutable_tree_new ()" link="ostree-In-memory-modifiable-filesystem-tree.html#ostree-mutable-tree-new"/>
|
<keyword type="function" name="ostree_mutable_tree_new ()" link="ostree-In-memory-modifiable-filesystem-tree.html#ostree-mutable-tree-new"/>
|
||||||
<keyword type="function" name="ostree_mutable_tree_set_metadata_checksum ()" link="ostree-In-memory-modifiable-filesystem-tree.html#ostree-mutable-tree-set-metadata-checksum"/>
|
<keyword type="function" name="ostree_mutable_tree_set_metadata_checksum ()" link="ostree-In-memory-modifiable-filesystem-tree.html#ostree-mutable-tree-set-metadata-checksum"/>
|
||||||
<keyword type="function" name="ostree_mutable_tree_get_metadata_checksum ()" link="ostree-In-memory-modifiable-filesystem-tree.html#ostree-mutable-tree-get-metadata-checksum"/>
|
<keyword type="function" name="ostree_mutable_tree_get_metadata_checksum ()" link="ostree-In-memory-modifiable-filesystem-tree.html#ostree-mutable-tree-get-metadata-checksum"/>
|
||||||
|
|
@ -386,53 +386,57 @@
|
||||||
<keyword type="constant" name="OSTREE_OBJECT_TYPE_COMMIT" link="ostree-Core-repository-independent-functions.html#OSTREE-OBJECT-TYPE-COMMIT:CAPS"/>
|
<keyword type="constant" name="OSTREE_OBJECT_TYPE_COMMIT" link="ostree-Core-repository-independent-functions.html#OSTREE-OBJECT-TYPE-COMMIT:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_OBJECT_TYPE_TOMBSTONE_COMMIT" link="ostree-Core-repository-independent-functions.html#OSTREE-OBJECT-TYPE-TOMBSTONE-COMMIT:CAPS"/>
|
<keyword type="constant" name="OSTREE_OBJECT_TYPE_TOMBSTONE_COMMIT" link="ostree-Core-repository-independent-functions.html#OSTREE-OBJECT-TYPE-TOMBSTONE-COMMIT:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_OBJECT_TYPE_COMMIT_META" link="ostree-Core-repository-independent-functions.html#OSTREE-OBJECT-TYPE-COMMIT-META:CAPS"/>
|
<keyword type="constant" name="OSTREE_OBJECT_TYPE_COMMIT_META" link="ostree-Core-repository-independent-functions.html#OSTREE-OBJECT-TYPE-COMMIT-META:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_MODE_BARE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-MODE-BARE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_MODE_BARE" link="ostree-OstreeRepo.html#OSTREE-REPO-MODE-BARE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_MODE_ARCHIVE_Z2" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-MODE-ARCHIVE-Z2:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_MODE_ARCHIVE_Z2" link="ostree-OstreeRepo.html#OSTREE-REPO-MODE-ARCHIVE-Z2:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_MODE_BARE_USER" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-MODE-BARE-USER:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_MODE_BARE_USER" link="ostree-OstreeRepo.html#OSTREE-REPO-MODE-BARE-USER:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_MODE_BARE_USER_ONLY" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-MODE-BARE-USER-ONLY:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_MODE_BARE_USER_ONLY" link="ostree-OstreeRepo.html#OSTREE-REPO-MODE-BARE-USER-ONLY:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_REMOTE_CHANGE_ADD" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-REMOTE-CHANGE-ADD:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_REMOTE_CHANGE_ADD" link="ostree-OstreeRepo.html#OSTREE-REPO-REMOTE-CHANGE-ADD:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_REMOTE_CHANGE_ADD_IF_NOT_EXISTS" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-REMOTE-CHANGE-ADD-IF-NOT-EXISTS:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_REMOTE_CHANGE_ADD_IF_NOT_EXISTS" link="ostree-OstreeRepo.html#OSTREE-REPO-REMOTE-CHANGE-ADD-IF-NOT-EXISTS:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_REMOTE_CHANGE_DELETE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-REMOTE-CHANGE-DELETE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_REMOTE_CHANGE_DELETE" link="ostree-OstreeRepo.html#OSTREE-REPO-REMOTE-CHANGE-DELETE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_REMOTE_CHANGE_DELETE_IF_EXISTS" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-REMOTE-CHANGE-DELETE-IF-EXISTS:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_REMOTE_CHANGE_DELETE_IF_EXISTS" link="ostree-OstreeRepo.html#OSTREE-REPO-REMOTE-CHANGE-DELETE-IF-EXISTS:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_RESOLVE_REV_EXT_NONE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-RESOLVE-REV-EXT-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_RESOLVE_REV_EXT_NONE" link="ostree-OstreeRepo.html#OSTREE-REPO-RESOLVE-REV-EXT-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_LIST_REFS_EXT_NONE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-LIST-REFS-EXT-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_LIST_REFS_EXT_NONE" link="ostree-OstreeRepo.html#OSTREE-REPO-LIST-REFS-EXT-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_LIST_REFS_EXT_ALIASES" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-LIST-REFS-EXT-ALIASES:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_LIST_REFS_EXT_ALIASES" link="ostree-OstreeRepo.html#OSTREE-REPO-LIST-REFS-EXT-ALIASES:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_STATE_PARTIAL" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-STATE-PARTIAL:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES" link="ostree-OstreeRepo.html#OSTREE-REPO-LIST-REFS-EXT-EXCLUDE-REMOTES:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_FILTER_ALLOW" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-FILTER-ALLOW:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_STATE_PARTIAL" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-STATE-PARTIAL:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_FILTER_SKIP" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-FILTER-SKIP:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_FILTER_ALLOW" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-FILTER-ALLOW:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_NONE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_FILTER_SKIP" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-FILTER-SKIP:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-SKIP-XATTRS:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_NONE" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_GENERATE_SIZES" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-GENERATE-SIZES:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_SKIP_XATTRS" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-SKIP-XATTRS:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CANONICAL_PERMISSIONS" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-CANONICAL-PERMISSIONS:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_GENERATE_SIZES" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-GENERATE-SIZES:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_ERROR_ON_UNLABELED" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-ERROR-ON-UNLABELED:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CANONICAL_PERMISSIONS" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-CANONICAL-PERMISSIONS:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_MODE_NONE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-CHECKOUT-MODE-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_MODIFIER_FLAGS_ERROR_ON_UNLABELED" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-MODIFIER-FLAGS-ERROR-ON-UNLABELED:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_MODE_USER" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-CHECKOUT-MODE-USER:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_MODE_NONE" link="ostree-OstreeRepo.html#OSTREE-REPO-CHECKOUT-MODE-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_OVERWRITE_NONE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-CHECKOUT-OVERWRITE-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_MODE_USER" link="ostree-OstreeRepo.html#OSTREE-REPO-CHECKOUT-MODE-USER:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-CHECKOUT-OVERWRITE-UNION-FILES:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_OVERWRITE_NONE" link="ostree-OstreeRepo.html#OSTREE-REPO-CHECKOUT-OVERWRITE-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-CHECKOUT-OVERWRITE-ADD-FILES:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES" link="ostree-OstreeRepo.html#OSTREE-REPO-CHECKOUT-OVERWRITE-UNION-FILES:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_LIST_OBJECTS_LOOSE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-LIST-OBJECTS-LOOSE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES" link="ostree-OstreeRepo.html#OSTREE-REPO-CHECKOUT-OVERWRITE-ADD-FILES:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_LIST_OBJECTS_PACKED" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-LIST-OBJECTS-PACKED:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL" link="ostree-OstreeRepo.html#OSTREE-REPO-CHECKOUT-OVERWRITE-UNION-IDENTICAL:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_LIST_OBJECTS_ALL" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-LIST-OBJECTS-ALL:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_LIST_OBJECTS_LOOSE" link="ostree-OstreeRepo.html#OSTREE-REPO-LIST-OBJECTS-LOOSE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_LIST_OBJECTS_NO_PARENTS" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-LIST-OBJECTS-NO-PARENTS:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_LIST_OBJECTS_PACKED" link="ostree-OstreeRepo.html#OSTREE-REPO-LIST-OBJECTS-PACKED:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_STATIC_DELTA_GENERATE_OPT_LOWLATENCY" link="ostree-Content-addressed-object-store.html#OSTREE-STATIC-DELTA-GENERATE-OPT-LOWLATENCY:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_LIST_OBJECTS_ALL" link="ostree-OstreeRepo.html#OSTREE-REPO-LIST-OBJECTS-ALL:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_STATIC_DELTA_GENERATE_OPT_MAJOR" link="ostree-Content-addressed-object-store.html#OSTREE-STATIC-DELTA-GENERATE-OPT-MAJOR:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_LIST_OBJECTS_NO_PARENTS" link="ostree-OstreeRepo.html#OSTREE-REPO-LIST-OBJECTS-NO-PARENTS:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_TRAVERSE_FLAG_NONE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-TRAVERSE-FLAG-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_STATIC_DELTA_GENERATE_OPT_LOWLATENCY" link="ostree-OstreeRepo.html#OSTREE-STATIC-DELTA-GENERATE-OPT-LOWLATENCY:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_ITER_RESULT_ERROR" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-ITER-RESULT-ERROR:CAPS"/>
|
<keyword type="constant" name="OSTREE_STATIC_DELTA_GENERATE_OPT_MAJOR" link="ostree-OstreeRepo.html#OSTREE-STATIC-DELTA-GENERATE-OPT-MAJOR:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_ITER_RESULT_END" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-ITER-RESULT-END:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_TRAVERSE_FLAG_NONE" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-TRAVERSE-FLAG-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_ITER_RESULT_FILE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-ITER-RESULT-FILE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_ITER_RESULT_ERROR" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-ITER-RESULT-ERROR:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_COMMIT_ITER_RESULT_DIR" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-COMMIT-ITER-RESULT-DIR:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_ITER_RESULT_END" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-ITER-RESULT-END:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_PRUNE_FLAGS_NONE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-PRUNE-FLAGS-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_ITER_RESULT_FILE" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-ITER-RESULT-FILE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_PRUNE_FLAGS_NO_PRUNE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-PRUNE-FLAGS-NO-PRUNE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_COMMIT_ITER_RESULT_DIR" link="ostree-OstreeRepo.html#OSTREE-REPO-COMMIT-ITER-RESULT-DIR:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-PRUNE-FLAGS-REFS-ONLY:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_PRUNE_FLAGS_NONE" link="ostree-OstreeRepo.html#OSTREE-REPO-PRUNE-FLAGS-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_NONE" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-PULL-FLAGS-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_PRUNE_FLAGS_NO_PRUNE" link="ostree-OstreeRepo.html#OSTREE-REPO-PRUNE-FLAGS-NO-PRUNE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_MIRROR" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-PULL-FLAGS-MIRROR:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY" link="ostree-OstreeRepo.html#OSTREE-REPO-PRUNE-FLAGS-REFS-ONLY:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_COMMIT_ONLY" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-PULL-FLAGS-COMMIT-ONLY:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_NONE" link="ostree-OstreeRepo.html#OSTREE-REPO-PULL-FLAGS-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_UNTRUSTED" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-PULL-FLAGS-UNTRUSTED:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_MIRROR" link="ostree-OstreeRepo.html#OSTREE-REPO-PULL-FLAGS-MIRROR:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_BAREUSERONLY_FILES" link="ostree-Content-addressed-object-store.html#OSTREE-REPO-PULL-FLAGS-BAREUSERONLY-FILES:CAPS"/>
|
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_COMMIT_ONLY" link="ostree-OstreeRepo.html#OSTREE-REPO-PULL-FLAGS-COMMIT-ONLY:CAPS"/>
|
||||||
|
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_UNTRUSTED" link="ostree-OstreeRepo.html#OSTREE-REPO-PULL-FLAGS-UNTRUSTED:CAPS"/>
|
||||||
|
<keyword type="constant" name="OSTREE_REPO_PULL_FLAGS_BAREUSERONLY_FILES" link="ostree-OstreeRepo.html#OSTREE-REPO-PULL-FLAGS-BAREUSERONLY-FILES:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NONE" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NONE" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN:CAPS"/>
|
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-NOT-DEFAULT:CAPS"/>
|
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-NOT-DEFAULT:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NO_CLEAN" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-NO-CLEAN:CAPS"/>
|
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NO_CLEAN" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-NO-CLEAN:CAPS"/>
|
||||||
|
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_PENDING" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN-PENDING:CAPS"/>
|
||||||
|
<keyword type="constant" name="OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_ROLLBACK" link="ostree-Root-partition-mount-point.html#OSTREE-SYSROOT-SIMPLE-WRITE-DEPLOYMENT-FLAGS-RETAIN-ROLLBACK:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_SEPOLICY_RESTORECON_FLAGS_NONE" link="ostree-SELinux-policy-management.html#OSTREE-SEPOLICY-RESTORECON-FLAGS-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_SEPOLICY_RESTORECON_FLAGS_NONE" link="ostree-SELinux-policy-management.html#OSTREE-SEPOLICY-RESTORECON-FLAGS-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_SEPOLICY_RESTORECON_FLAGS_ALLOW_NOLABEL" link="ostree-SELinux-policy-management.html#OSTREE-SEPOLICY-RESTORECON-FLAGS-ALLOW-NOLABEL:CAPS"/>
|
<keyword type="constant" name="OSTREE_SEPOLICY_RESTORECON_FLAGS_ALLOW_NOLABEL" link="ostree-SELinux-policy-management.html#OSTREE-SEPOLICY-RESTORECON-FLAGS-ALLOW-NOLABEL:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_SEPOLICY_RESTORECON_FLAGS_KEEP_EXISTING" link="ostree-SELinux-policy-management.html#OSTREE-SEPOLICY-RESTORECON-FLAGS-KEEP-EXISTING:CAPS"/>
|
<keyword type="constant" name="OSTREE_SEPOLICY_RESTORECON_FLAGS_KEEP_EXISTING" link="ostree-SELinux-policy-management.html#OSTREE-SEPOLICY-RESTORECON-FLAGS-KEEP-EXISTING:CAPS"/>
|
||||||
|
|
@ -456,18 +460,19 @@
|
||||||
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_ATTR_HASH_ALGO_NAME" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-ATTR-HASH-ALGO-NAME:CAPS"/>
|
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_ATTR_HASH_ALGO_NAME" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-ATTR-HASH-ALGO-NAME:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_ATTR_USER_NAME" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-ATTR-USER-NAME:CAPS"/>
|
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_ATTR_USER_NAME" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-ATTR-USER-NAME:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-ATTR-USER-EMAIL:CAPS"/>
|
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-ATTR-USER-EMAIL:CAPS"/>
|
||||||
|
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT_PRIMARY" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-ATTR-FINGERPRINT-PRIMARY:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_FORMAT_DEFAULT" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-FORMAT-DEFAULT:CAPS"/>
|
<keyword type="constant" name="OSTREE_GPG_SIGNATURE_FORMAT_DEFAULT" link="ostree-GPG-signature-verification-results.html#OSTREE-GPG-SIGNATURE-FORMAT-DEFAULT:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_DIFF_FLAGS_NONE" link="ostree-ostree-diff.html#OSTREE-DIFF-FLAGS-NONE:CAPS"/>
|
<keyword type="constant" name="OSTREE_DIFF_FLAGS_NONE" link="ostree-ostree-diff.html#OSTREE-DIFF-FLAGS-NONE:CAPS"/>
|
||||||
<keyword type="constant" name="OSTREE_DIFF_FLAGS_IGNORE_XATTRS" link="ostree-ostree-diff.html#OSTREE-DIFF-FLAGS-IGNORE-XATTRS:CAPS"/>
|
<keyword type="constant" name="OSTREE_DIFF_FLAGS_IGNORE_XATTRS" link="ostree-ostree-diff.html#OSTREE-DIFF-FLAGS-IGNORE-XATTRS:CAPS"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.metadata-objects-total" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.metadata-objects-total"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.metadata-objects-total" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.metadata-objects-total"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.metadata-objects-written" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.metadata-objects-written"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.metadata-objects-written" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.metadata-objects-written"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.content-objects-total" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.content-objects-total"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.content-objects-total" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.content-objects-total"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.content-objects-written" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.content-objects-written"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.content-objects-written" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.content-objects-written"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.content-bytes-written" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.content-bytes-written"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.content-bytes-written" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.content-bytes-written"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.padding1" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.padding1"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.padding1" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.padding1"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.padding2" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.padding2"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.padding2" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.padding2"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.padding3" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.padding3"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.padding3" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.padding3"/>
|
||||||
<keyword type="member" name="OstreeRepoTransactionStats.padding4" link="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats.padding4"/>
|
<keyword type="member" name="OstreeRepoTransactionStats.padding4" link="ostree-OstreeRepo.html#OstreeRepoTransactionStats.padding4"/>
|
||||||
<keyword type="member" name="OstreeDeployment.index" link="ostree-ostree-deployment.html#OstreeDeployment.index"/>
|
<keyword type="member" name="OstreeDeployment.index" link="ostree-ostree-deployment.html#OstreeDeployment.index"/>
|
||||||
<keyword type="member" name="OstreeDeployment.osname" link="ostree-ostree-deployment.html#OstreeDeployment.osname"/>
|
<keyword type="member" name="OstreeDeployment.osname" link="ostree-ostree-deployment.html#OstreeDeployment.osname"/>
|
||||||
<keyword type="member" name="OstreeDeployment.csum" link="ostree-ostree-deployment.html#OstreeDeployment.csum"/>
|
<keyword type="member" name="OstreeDeployment.csum" link="ostree-ostree-deployment.html#OstreeDeployment.csum"/>
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
<span class="refentrytitle"><a href="ostree-Core-repository-independent-functions.html">Core repository-independent functions</a></span><span class="refpurpose"> — Create, validate, and convert core data types</span>
|
<span class="refentrytitle"><a href="ostree-Core-repository-independent-functions.html">Core repository-independent functions</a></span><span class="refpurpose"> — Create, validate, and convert core data types</span>
|
||||||
</dt>
|
</dt>
|
||||||
<dt>
|
<dt>
|
||||||
<span class="refentrytitle"><a href="ostree-Content-addressed-object-store.html">Content-addressed object store</a></span><span class="refpurpose"> — A git-like storage system for operating system binaries</span>
|
<span class="refentrytitle"><a href="ostree-OstreeRepo.html">OstreeRepo: Content-addressed object store</a></span><span class="refpurpose"> — A git-like storage system for operating system binaries</span>
|
||||||
</dt>
|
</dt>
|
||||||
<dt>
|
<dt>
|
||||||
<span class="refentrytitle"><a href="ostree-In-memory-modifiable-filesystem-tree.html">In-memory modifiable filesystem tree</a></span><span class="refpurpose"> — Modifiable filesystem tree</span>
|
<span class="refentrytitle"><a href="ostree-In-memory-modifiable-filesystem-tree.html">In-memory modifiable filesystem tree</a></span><span class="refpurpose"> — Modifiable filesystem tree</span>
|
||||||
|
|
@ -594,47 +594,47 @@ OSTREE_RELEASE_VERSION, macro in ostree-version
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepo" title="OstreeRepo">OstreeRepo</a>, typedef in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepo" title="OstreeRepo">OstreeRepo</a>, typedef in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCheckoutMode" title="enum OstreeRepoCheckoutMode">OstreeRepoCheckoutMode</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCheckoutMode" title="enum OstreeRepoCheckoutMode">OstreeRepoCheckoutMode</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCheckoutOverwriteMode" title="enum OstreeRepoCheckoutOverwriteMode">OstreeRepoCheckoutOverwriteMode</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCheckoutOverwriteMode" title="enum OstreeRepoCheckoutOverwriteMode">OstreeRepoCheckoutOverwriteMode</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCommitFilter" title="OstreeRepoCommitFilter ()">OstreeRepoCommitFilter</a>, user_function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCommitFilter" title="OstreeRepoCommitFilter ()">OstreeRepoCommitFilter</a>, user_function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCommitFilterResult" title="enum OstreeRepoCommitFilterResult">OstreeRepoCommitFilterResult</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCommitFilterResult" title="enum OstreeRepoCommitFilterResult">OstreeRepoCommitFilterResult</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCommitIterResult" title="enum OstreeRepoCommitIterResult">OstreeRepoCommitIterResult</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCommitIterResult" title="enum OstreeRepoCommitIterResult">OstreeRepoCommitIterResult</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCommitModifier" title="OstreeRepoCommitModifier">OstreeRepoCommitModifier</a>, typedef in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCommitModifier" title="OstreeRepoCommitModifier">OstreeRepoCommitModifier</a>, typedef in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCommitModifierFlags" title="enum OstreeRepoCommitModifierFlags">OstreeRepoCommitModifierFlags</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCommitModifierFlags" title="enum OstreeRepoCommitModifierFlags">OstreeRepoCommitModifierFlags</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCommitModifierXattrCallback" title="OstreeRepoCommitModifierXattrCallback ()">OstreeRepoCommitModifierXattrCallback</a>, user_function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCommitModifierXattrCallback" title="OstreeRepoCommitModifierXattrCallback ()">OstreeRepoCommitModifierXattrCallback</a>, user_function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCommitState" title="enum OstreeRepoCommitState">OstreeRepoCommitState</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCommitState" title="enum OstreeRepoCommitState">OstreeRepoCommitState</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoCommitTraverseFlags" title="enum OstreeRepoCommitTraverseFlags">OstreeRepoCommitTraverseFlags</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoCommitTraverseFlags" title="enum OstreeRepoCommitTraverseFlags">OstreeRepoCommitTraverseFlags</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
|
|
@ -642,155 +642,155 @@ OSTREE_RELEASE_VERSION, macro in ostree-version
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoListObjectsFlags" title="enum OstreeRepoListObjectsFlags">OstreeRepoListObjectsFlags</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoListObjectsFlags" title="enum OstreeRepoListObjectsFlags">OstreeRepoListObjectsFlags</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoListRefsExtFlags" title="enum OstreeRepoListRefsExtFlags">OstreeRepoListRefsExtFlags</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoListRefsExtFlags" title="enum OstreeRepoListRefsExtFlags">OstreeRepoListRefsExtFlags</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoMode" title="enum OstreeRepoMode">OstreeRepoMode</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoMode" title="enum OstreeRepoMode">OstreeRepoMode</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoPruneFlags" title="enum OstreeRepoPruneFlags">OstreeRepoPruneFlags</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoPruneFlags" title="enum OstreeRepoPruneFlags">OstreeRepoPruneFlags</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoPullFlags" title="enum OstreeRepoPullFlags">OstreeRepoPullFlags</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoPullFlags" title="enum OstreeRepoPullFlags">OstreeRepoPullFlags</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoRemoteChange" title="enum OstreeRepoRemoteChange">OstreeRepoRemoteChange</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoRemoteChange" title="enum OstreeRepoRemoteChange">OstreeRepoRemoteChange</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoResolveRevExtFlags" title="enum OstreeRepoResolveRevExtFlags">OstreeRepoResolveRevExtFlags</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoResolveRevExtFlags" title="enum OstreeRepoResolveRevExtFlags">OstreeRepoResolveRevExtFlags</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeRepoTransactionStats" title="struct OstreeRepoTransactionStats">OstreeRepoTransactionStats</a>, struct in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeRepoTransactionStats" title="struct OstreeRepoTransactionStats">OstreeRepoTransactionStats</a>, struct in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-abort-transaction" title="ostree_repo_abort_transaction ()">ostree_repo_abort_transaction</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-abort-transaction" title="ostree_repo_abort_transaction ()">ostree_repo_abort_transaction</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-add-gpg-signature-summary" title="ostree_repo_add_gpg_signature_summary ()">ostree_repo_add_gpg_signature_summary</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-add-gpg-signature-summary" title="ostree_repo_add_gpg_signature_summary ()">ostree_repo_add_gpg_signature_summary</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-append-gpg-signature" title="ostree_repo_append_gpg_signature ()">ostree_repo_append_gpg_signature</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-append-gpg-signature" title="ostree_repo_append_gpg_signature ()">ostree_repo_append_gpg_signature</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-checkout-at" title="ostree_repo_checkout_at ()">ostree_repo_checkout_at</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-checkout-at" title="ostree_repo_checkout_at ()">ostree_repo_checkout_at</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-checkout-gc" title="ostree_repo_checkout_gc ()">ostree_repo_checkout_gc</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-checkout-gc" title="ostree_repo_checkout_gc ()">ostree_repo_checkout_gc</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-checkout-tree" title="ostree_repo_checkout_tree ()">ostree_repo_checkout_tree</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-checkout-tree" title="ostree_repo_checkout_tree ()">ostree_repo_checkout_tree</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-checkout-tree-at" title="ostree_repo_checkout_tree_at ()">ostree_repo_checkout_tree_at</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-checkout-tree-at" title="ostree_repo_checkout_tree_at ()">ostree_repo_checkout_tree_at</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-new" title="ostree_repo_commit_modifier_new ()">ostree_repo_commit_modifier_new</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-modifier-new" title="ostree_repo_commit_modifier_new ()">ostree_repo_commit_modifier_new</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-ref" title="ostree_repo_commit_modifier_ref ()">ostree_repo_commit_modifier_ref</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-modifier-ref" title="ostree_repo_commit_modifier_ref ()">ostree_repo_commit_modifier_ref</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-set-devino-cache" title="ostree_repo_commit_modifier_set_devino_cache ()">ostree_repo_commit_modifier_set_devino_cache</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-modifier-set-devino-cache" title="ostree_repo_commit_modifier_set_devino_cache ()">ostree_repo_commit_modifier_set_devino_cache</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-set-sepolicy" title="ostree_repo_commit_modifier_set_sepolicy ()">ostree_repo_commit_modifier_set_sepolicy</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-modifier-set-sepolicy" title="ostree_repo_commit_modifier_set_sepolicy ()">ostree_repo_commit_modifier_set_sepolicy</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-set-xattr-callback" title="ostree_repo_commit_modifier_set_xattr_callback ()">ostree_repo_commit_modifier_set_xattr_callback</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-modifier-set-xattr-callback" title="ostree_repo_commit_modifier_set_xattr_callback ()">ostree_repo_commit_modifier_set_xattr_callback</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-modifier-unref" title="ostree_repo_commit_modifier_unref ()">ostree_repo_commit_modifier_unref</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-modifier-unref" title="ostree_repo_commit_modifier_unref ()">ostree_repo_commit_modifier_unref</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-transaction" title="ostree_repo_commit_transaction ()">ostree_repo_commit_transaction</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-transaction" title="ostree_repo_commit_transaction ()">ostree_repo_commit_transaction</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-cleanup" title="ostree_repo_commit_traverse_iter_cleanup ()">ostree_repo_commit_traverse_iter_cleanup</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-cleanup" title="ostree_repo_commit_traverse_iter_cleanup ()">ostree_repo_commit_traverse_iter_cleanup</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-clear" title="ostree_repo_commit_traverse_iter_clear ()">ostree_repo_commit_traverse_iter_clear</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-clear" title="ostree_repo_commit_traverse_iter_clear ()">ostree_repo_commit_traverse_iter_clear</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-get-dir" title="ostree_repo_commit_traverse_iter_get_dir ()">ostree_repo_commit_traverse_iter_get_dir</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-get-dir" title="ostree_repo_commit_traverse_iter_get_dir ()">ostree_repo_commit_traverse_iter_get_dir</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-get-file" title="ostree_repo_commit_traverse_iter_get_file ()">ostree_repo_commit_traverse_iter_get_file</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-get-file" title="ostree_repo_commit_traverse_iter_get_file ()">ostree_repo_commit_traverse_iter_get_file</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-init-commit" title="ostree_repo_commit_traverse_iter_init_commit ()">ostree_repo_commit_traverse_iter_init_commit</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-init-commit" title="ostree_repo_commit_traverse_iter_init_commit ()">ostree_repo_commit_traverse_iter_init_commit</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-init-dirtree" title="ostree_repo_commit_traverse_iter_init_dirtree ()">ostree_repo_commit_traverse_iter_init_dirtree</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-init-dirtree" title="ostree_repo_commit_traverse_iter_init_dirtree ()">ostree_repo_commit_traverse_iter_init_dirtree</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-commit-traverse-iter-next" title="ostree_repo_commit_traverse_iter_next ()">ostree_repo_commit_traverse_iter_next</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-commit-traverse-iter-next" title="ostree_repo_commit_traverse_iter_next ()">ostree_repo_commit_traverse_iter_next</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-copy-config" title="ostree_repo_copy_config ()">ostree_repo_copy_config</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-copy-config" title="ostree_repo_copy_config ()">ostree_repo_copy_config</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-create" title="ostree_repo_create ()">ostree_repo_create</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-create" title="ostree_repo_create ()">ostree_repo_create</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-create-at" title="ostree_repo_create_at ()">ostree_repo_create_at</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-create-at" title="ostree_repo_create_at ()">ostree_repo_create_at</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-delete-object" title="ostree_repo_delete_object ()">ostree_repo_delete_object</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-delete-object" title="ostree_repo_delete_object ()">ostree_repo_delete_object</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-devino-cache-get-type" title="ostree_repo_devino_cache_get_type ()">ostree_repo_devino_cache_get_type</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-devino-cache-get-type" title="ostree_repo_devino_cache_get_type ()">ostree_repo_devino_cache_get_type</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-devino-cache-new" title="ostree_repo_devino_cache_new ()">ostree_repo_devino_cache_new</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-devino-cache-new" title="ostree_repo_devino_cache_new ()">ostree_repo_devino_cache_new</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-devino-cache-ref" title="ostree_repo_devino_cache_ref ()">ostree_repo_devino_cache_ref</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-devino-cache-ref" title="ostree_repo_devino_cache_ref ()">ostree_repo_devino_cache_ref</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-devino-cache-unref" title="ostree_repo_devino_cache_unref ()">ostree_repo_devino_cache_unref</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-devino-cache-unref" title="ostree_repo_devino_cache_unref ()">ostree_repo_devino_cache_unref</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-export-tree-to-archive" title="ostree_repo_export_tree_to_archive ()">ostree_repo_export_tree_to_archive</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-export-tree-to-archive" title="ostree_repo_export_tree_to_archive ()">ostree_repo_export_tree_to_archive</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
|
|
@ -842,379 +842,379 @@ OSTREE_RELEASE_VERSION, macro in ostree-version
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-config" title="ostree_repo_get_config ()">ostree_repo_get_config</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-config" title="ostree_repo_get_config ()">ostree_repo_get_config</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-dfd" title="ostree_repo_get_dfd ()">ostree_repo_get_dfd</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-dfd" title="ostree_repo_get_dfd ()">ostree_repo_get_dfd</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-disable-fsync" title="ostree_repo_get_disable_fsync ()">ostree_repo_get_disable_fsync</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-disable-fsync" title="ostree_repo_get_disable_fsync ()">ostree_repo_get_disable_fsync</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-mode" title="ostree_repo_get_mode ()">ostree_repo_get_mode</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-mode" title="ostree_repo_get_mode ()">ostree_repo_get_mode</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-parent" title="ostree_repo_get_parent ()">ostree_repo_get_parent</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-parent" title="ostree_repo_get_parent ()">ostree_repo_get_parent</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-path" title="ostree_repo_get_path ()">ostree_repo_get_path</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-path" title="ostree_repo_get_path ()">ostree_repo_get_path</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-remote-boolean-option" title="ostree_repo_get_remote_boolean_option ()">ostree_repo_get_remote_boolean_option</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-remote-boolean-option" title="ostree_repo_get_remote_boolean_option ()">ostree_repo_get_remote_boolean_option</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-remote-list-option" title="ostree_repo_get_remote_list_option ()">ostree_repo_get_remote_list_option</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-remote-list-option" title="ostree_repo_get_remote_list_option ()">ostree_repo_get_remote_list_option</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-get-remote-option" title="ostree_repo_get_remote_option ()">ostree_repo_get_remote_option</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-get-remote-option" title="ostree_repo_get_remote_option ()">ostree_repo_get_remote_option</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-gpg-verify-data" title="ostree_repo_gpg_verify_data ()">ostree_repo_gpg_verify_data</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-gpg-verify-data" title="ostree_repo_gpg_verify_data ()">ostree_repo_gpg_verify_data</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-has-object" title="ostree_repo_has_object ()">ostree_repo_has_object</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-has-object" title="ostree_repo_has_object ()">ostree_repo_has_object</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-import-archive-to-mtree" title="ostree_repo_import_archive_to_mtree ()">ostree_repo_import_archive_to_mtree</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-import-archive-to-mtree" title="ostree_repo_import_archive_to_mtree ()">ostree_repo_import_archive_to_mtree</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-import-object-from" title="ostree_repo_import_object_from ()">ostree_repo_import_object_from</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-import-object-from" title="ostree_repo_import_object_from ()">ostree_repo_import_object_from</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-import-object-from-with-trust" title="ostree_repo_import_object_from_with_trust ()">ostree_repo_import_object_from_with_trust</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-import-object-from-with-trust" title="ostree_repo_import_object_from_with_trust ()">ostree_repo_import_object_from_with_trust</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-is-system" title="ostree_repo_is_system ()">ostree_repo_is_system</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-is-system" title="ostree_repo_is_system ()">ostree_repo_is_system</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-is-writable" title="ostree_repo_is_writable ()">ostree_repo_is_writable</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-is-writable" title="ostree_repo_is_writable ()">ostree_repo_is_writable</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-list-commit-objects-starting-with" title="ostree_repo_list_commit_objects_starting_with ()">ostree_repo_list_commit_objects_starting_with</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-list-commit-objects-starting-with" title="ostree_repo_list_commit_objects_starting_with ()">ostree_repo_list_commit_objects_starting_with</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-list-objects" title="ostree_repo_list_objects ()">ostree_repo_list_objects</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-list-objects" title="ostree_repo_list_objects ()">ostree_repo_list_objects</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OSTREE-REPO-LIST-OBJECTS-VARIANT-TYPE:CAPS" title="OSTREE_REPO_LIST_OBJECTS_VARIANT_TYPE">OSTREE_REPO_LIST_OBJECTS_VARIANT_TYPE</a>, macro in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OSTREE-REPO-LIST-OBJECTS-VARIANT-TYPE:CAPS" title="OSTREE_REPO_LIST_OBJECTS_VARIANT_TYPE">OSTREE_REPO_LIST_OBJECTS_VARIANT_TYPE</a>, macro in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-list-refs" title="ostree_repo_list_refs ()">ostree_repo_list_refs</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-list-refs" title="ostree_repo_list_refs ()">ostree_repo_list_refs</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-list-refs-ext" title="ostree_repo_list_refs_ext ()">ostree_repo_list_refs_ext</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-list-refs-ext" title="ostree_repo_list_refs_ext ()">ostree_repo_list_refs_ext</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-list-static-delta-names" title="ostree_repo_list_static_delta_names ()">ostree_repo_list_static_delta_names</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-list-static-delta-names" title="ostree_repo_list_static_delta_names ()">ostree_repo_list_static_delta_names</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-load-commit" title="ostree_repo_load_commit ()">ostree_repo_load_commit</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-load-commit" title="ostree_repo_load_commit ()">ostree_repo_load_commit</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-load-file" title="ostree_repo_load_file ()">ostree_repo_load_file</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-load-file" title="ostree_repo_load_file ()">ostree_repo_load_file</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-load-object-stream" title="ostree_repo_load_object_stream ()">ostree_repo_load_object_stream</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-load-object-stream" title="ostree_repo_load_object_stream ()">ostree_repo_load_object_stream</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-load-variant" title="ostree_repo_load_variant ()">ostree_repo_load_variant</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-load-variant" title="ostree_repo_load_variant ()">ostree_repo_load_variant</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-load-variant-if-exists" title="ostree_repo_load_variant_if_exists ()">ostree_repo_load_variant_if_exists</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-load-variant-if-exists" title="ostree_repo_load_variant_if_exists ()">ostree_repo_load_variant_if_exists</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-mode-from-string" title="ostree_repo_mode_from_string ()">ostree_repo_mode_from_string</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-mode-from-string" title="ostree_repo_mode_from_string ()">ostree_repo_mode_from_string</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-new" title="ostree_repo_new ()">ostree_repo_new</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-new" title="ostree_repo_new ()">ostree_repo_new</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-new-default" title="ostree_repo_new_default ()">ostree_repo_new_default</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-new-default" title="ostree_repo_new_default ()">ostree_repo_new_default</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-new-for-sysroot-path" title="ostree_repo_new_for_sysroot_path ()">ostree_repo_new_for_sysroot_path</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-new-for-sysroot-path" title="ostree_repo_new_for_sysroot_path ()">ostree_repo_new_for_sysroot_path</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-open" title="ostree_repo_open ()">ostree_repo_open</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-open" title="ostree_repo_open ()">ostree_repo_open</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-open-at" title="ostree_repo_open_at ()">ostree_repo_open_at</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-open-at" title="ostree_repo_open_at ()">ostree_repo_open_at</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-prepare-transaction" title="ostree_repo_prepare_transaction ()">ostree_repo_prepare_transaction</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-prepare-transaction" title="ostree_repo_prepare_transaction ()">ostree_repo_prepare_transaction</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-prune" title="ostree_repo_prune ()">ostree_repo_prune</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-prune" title="ostree_repo_prune ()">ostree_repo_prune</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-prune-from-reachable" title="ostree_repo_prune_from_reachable ()">ostree_repo_prune_from_reachable</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-prune-from-reachable" title="ostree_repo_prune_from_reachable ()">ostree_repo_prune_from_reachable</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-prune-static-deltas" title="ostree_repo_prune_static_deltas ()">ostree_repo_prune_static_deltas</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-prune-static-deltas" title="ostree_repo_prune_static_deltas ()">ostree_repo_prune_static_deltas</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-pull" title="ostree_repo_pull ()">ostree_repo_pull</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-pull" title="ostree_repo_pull ()">ostree_repo_pull</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-pull-default-console-progress-changed" title="ostree_repo_pull_default_console_progress_changed ()">ostree_repo_pull_default_console_progress_changed</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-pull-default-console-progress-changed" title="ostree_repo_pull_default_console_progress_changed ()">ostree_repo_pull_default_console_progress_changed</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-pull-one-dir" title="ostree_repo_pull_one_dir ()">ostree_repo_pull_one_dir</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-pull-one-dir" title="ostree_repo_pull_one_dir ()">ostree_repo_pull_one_dir</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-pull-with-options" title="ostree_repo_pull_with_options ()">ostree_repo_pull_with_options</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-pull-with-options" title="ostree_repo_pull_with_options ()">ostree_repo_pull_with_options</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-query-object-storage-size" title="ostree_repo_query_object_storage_size ()">ostree_repo_query_object_storage_size</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-query-object-storage-size" title="ostree_repo_query_object_storage_size ()">ostree_repo_query_object_storage_size</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-read-commit" title="ostree_repo_read_commit ()">ostree_repo_read_commit</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-read-commit" title="ostree_repo_read_commit ()">ostree_repo_read_commit</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-read-commit-detached-metadata" title="ostree_repo_read_commit_detached_metadata ()">ostree_repo_read_commit_detached_metadata</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-read-commit-detached-metadata" title="ostree_repo_read_commit_detached_metadata ()">ostree_repo_read_commit_detached_metadata</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-regenerate-summary" title="ostree_repo_regenerate_summary ()">ostree_repo_regenerate_summary</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-regenerate-summary" title="ostree_repo_regenerate_summary ()">ostree_repo_regenerate_summary</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-reload-config" title="ostree_repo_reload_config ()">ostree_repo_reload_config</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-reload-config" title="ostree_repo_reload_config ()">ostree_repo_reload_config</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-add" title="ostree_repo_remote_add ()">ostree_repo_remote_add</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-add" title="ostree_repo_remote_add ()">ostree_repo_remote_add</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-change" title="ostree_repo_remote_change ()">ostree_repo_remote_change</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-change" title="ostree_repo_remote_change ()">ostree_repo_remote_change</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-delete" title="ostree_repo_remote_delete ()">ostree_repo_remote_delete</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-delete" title="ostree_repo_remote_delete ()">ostree_repo_remote_delete</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-fetch-summary" title="ostree_repo_remote_fetch_summary ()">ostree_repo_remote_fetch_summary</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-fetch-summary" title="ostree_repo_remote_fetch_summary ()">ostree_repo_remote_fetch_summary</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-fetch-summary-with-options" title="ostree_repo_remote_fetch_summary_with_options ()">ostree_repo_remote_fetch_summary_with_options</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-fetch-summary-with-options" title="ostree_repo_remote_fetch_summary_with_options ()">ostree_repo_remote_fetch_summary_with_options</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-get-gpg-verify" title="ostree_repo_remote_get_gpg_verify ()">ostree_repo_remote_get_gpg_verify</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-get-gpg-verify" title="ostree_repo_remote_get_gpg_verify ()">ostree_repo_remote_get_gpg_verify</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-get-gpg-verify-summary" title="ostree_repo_remote_get_gpg_verify_summary ()">ostree_repo_remote_get_gpg_verify_summary</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-get-gpg-verify-summary" title="ostree_repo_remote_get_gpg_verify_summary ()">ostree_repo_remote_get_gpg_verify_summary</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-get-url" title="ostree_repo_remote_get_url ()">ostree_repo_remote_get_url</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-get-url" title="ostree_repo_remote_get_url ()">ostree_repo_remote_get_url</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-gpg-import" title="ostree_repo_remote_gpg_import ()">ostree_repo_remote_gpg_import</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-gpg-import" title="ostree_repo_remote_gpg_import ()">ostree_repo_remote_gpg_import</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-list" title="ostree_repo_remote_list ()">ostree_repo_remote_list</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-list" title="ostree_repo_remote_list ()">ostree_repo_remote_list</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-remote-list-refs" title="ostree_repo_remote_list_refs ()">ostree_repo_remote_list_refs</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-remote-list-refs" title="ostree_repo_remote_list_refs ()">ostree_repo_remote_list_refs</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-resolve-rev" title="ostree_repo_resolve_rev ()">ostree_repo_resolve_rev</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-resolve-rev" title="ostree_repo_resolve_rev ()">ostree_repo_resolve_rev</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-resolve-rev-ext" title="ostree_repo_resolve_rev_ext ()">ostree_repo_resolve_rev_ext</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-resolve-rev-ext" title="ostree_repo_resolve_rev_ext ()">ostree_repo_resolve_rev_ext</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-scan-hardlinks" title="ostree_repo_scan_hardlinks ()">ostree_repo_scan_hardlinks</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-scan-hardlinks" title="ostree_repo_scan_hardlinks ()">ostree_repo_scan_hardlinks</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-set-alias-ref-immediate" title="ostree_repo_set_alias_ref_immediate ()">ostree_repo_set_alias_ref_immediate</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-set-alias-ref-immediate" title="ostree_repo_set_alias_ref_immediate ()">ostree_repo_set_alias_ref_immediate</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-set-cache-dir" title="ostree_repo_set_cache_dir ()">ostree_repo_set_cache_dir</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-set-cache-dir" title="ostree_repo_set_cache_dir ()">ostree_repo_set_cache_dir</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-set-disable-fsync" title="ostree_repo_set_disable_fsync ()">ostree_repo_set_disable_fsync</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-set-disable-fsync" title="ostree_repo_set_disable_fsync ()">ostree_repo_set_disable_fsync</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-set-ref-immediate" title="ostree_repo_set_ref_immediate ()">ostree_repo_set_ref_immediate</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-set-ref-immediate" title="ostree_repo_set_ref_immediate ()">ostree_repo_set_ref_immediate</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-sign-commit" title="ostree_repo_sign_commit ()">ostree_repo_sign_commit</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-sign-commit" title="ostree_repo_sign_commit ()">ostree_repo_sign_commit</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-sign-delta" title="ostree_repo_sign_delta ()">ostree_repo_sign_delta</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-sign-delta" title="ostree_repo_sign_delta ()">ostree_repo_sign_delta</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-static-delta-execute-offline" title="ostree_repo_static_delta_execute_offline ()">ostree_repo_static_delta_execute_offline</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-static-delta-execute-offline" title="ostree_repo_static_delta_execute_offline ()">ostree_repo_static_delta_execute_offline</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-static-delta-generate" title="ostree_repo_static_delta_generate ()">ostree_repo_static_delta_generate</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-static-delta-generate" title="ostree_repo_static_delta_generate ()">ostree_repo_static_delta_generate</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-transaction-set-ref" title="ostree_repo_transaction_set_ref ()">ostree_repo_transaction_set_ref</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-transaction-set-ref" title="ostree_repo_transaction_set_ref ()">ostree_repo_transaction_set_ref</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-transaction-set-refspec" title="ostree_repo_transaction_set_refspec ()">ostree_repo_transaction_set_refspec</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-transaction-set-refspec" title="ostree_repo_transaction_set_refspec ()">ostree_repo_transaction_set_refspec</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-traverse-commit" title="ostree_repo_traverse_commit ()">ostree_repo_traverse_commit</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-traverse-commit" title="ostree_repo_traverse_commit ()">ostree_repo_traverse_commit</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-traverse-commit-union" title="ostree_repo_traverse_commit_union ()">ostree_repo_traverse_commit_union</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-traverse-commit-union" title="ostree_repo_traverse_commit_union ()">ostree_repo_traverse_commit_union</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-traverse-new-reachable" title="ostree_repo_traverse_new_reachable ()">ostree_repo_traverse_new_reachable</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-traverse-new-reachable" title="ostree_repo_traverse_new_reachable ()">ostree_repo_traverse_new_reachable</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-verify-commit" title="ostree_repo_verify_commit ()">ostree_repo_verify_commit</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-verify-commit" title="ostree_repo_verify_commit ()">ostree_repo_verify_commit</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-verify-commit-ext" title="ostree_repo_verify_commit_ext ()">ostree_repo_verify_commit_ext</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-verify-commit-ext" title="ostree_repo_verify_commit_ext ()">ostree_repo_verify_commit_ext</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-verify-commit-for-remote" title="ostree_repo_verify_commit_for_remote ()">ostree_repo_verify_commit_for_remote</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-verify-commit-for-remote" title="ostree_repo_verify_commit_for_remote ()">ostree_repo_verify_commit_for_remote</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-verify-summary" title="ostree_repo_verify_summary ()">ostree_repo_verify_summary</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-verify-summary" title="ostree_repo_verify_summary ()">ostree_repo_verify_summary</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-archive-to-mtree" title="ostree_repo_write_archive_to_mtree ()">ostree_repo_write_archive_to_mtree</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-archive-to-mtree" title="ostree_repo_write_archive_to_mtree ()">ostree_repo_write_archive_to_mtree</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-commit" title="ostree_repo_write_commit ()">ostree_repo_write_commit</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-commit" title="ostree_repo_write_commit ()">ostree_repo_write_commit</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-commit-detached-metadata" title="ostree_repo_write_commit_detached_metadata ()">ostree_repo_write_commit_detached_metadata</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-commit-detached-metadata" title="ostree_repo_write_commit_detached_metadata ()">ostree_repo_write_commit_detached_metadata</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-commit-with-time" title="ostree_repo_write_commit_with_time ()">ostree_repo_write_commit_with_time</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-commit-with-time" title="ostree_repo_write_commit_with_time ()">ostree_repo_write_commit_with_time</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-config" title="ostree_repo_write_config ()">ostree_repo_write_config</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-config" title="ostree_repo_write_config ()">ostree_repo_write_config</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-content" title="ostree_repo_write_content ()">ostree_repo_write_content</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-content" title="ostree_repo_write_content ()">ostree_repo_write_content</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-content-async" title="ostree_repo_write_content_async ()">ostree_repo_write_content_async</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-content-async" title="ostree_repo_write_content_async ()">ostree_repo_write_content_async</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-content-finish" title="ostree_repo_write_content_finish ()">ostree_repo_write_content_finish</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-content-finish" title="ostree_repo_write_content_finish ()">ostree_repo_write_content_finish</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-content-trusted" title="ostree_repo_write_content_trusted ()">ostree_repo_write_content_trusted</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-content-trusted" title="ostree_repo_write_content_trusted ()">ostree_repo_write_content_trusted</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-dfd-to-mtree" title="ostree_repo_write_dfd_to_mtree ()">ostree_repo_write_dfd_to_mtree</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-dfd-to-mtree" title="ostree_repo_write_dfd_to_mtree ()">ostree_repo_write_dfd_to_mtree</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-directory-to-mtree" title="ostree_repo_write_directory_to_mtree ()">ostree_repo_write_directory_to_mtree</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-directory-to-mtree" title="ostree_repo_write_directory_to_mtree ()">ostree_repo_write_directory_to_mtree</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata" title="ostree_repo_write_metadata ()">ostree_repo_write_metadata</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-metadata" title="ostree_repo_write_metadata ()">ostree_repo_write_metadata</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata-async" title="ostree_repo_write_metadata_async ()">ostree_repo_write_metadata_async</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-metadata-async" title="ostree_repo_write_metadata_async ()">ostree_repo_write_metadata_async</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata-finish" title="ostree_repo_write_metadata_finish ()">ostree_repo_write_metadata_finish</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-metadata-finish" title="ostree_repo_write_metadata_finish ()">ostree_repo_write_metadata_finish</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata-stream-trusted" title="ostree_repo_write_metadata_stream_trusted ()">ostree_repo_write_metadata_stream_trusted</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-metadata-stream-trusted" title="ostree_repo_write_metadata_stream_trusted ()">ostree_repo_write_metadata_stream_trusted</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-metadata-trusted" title="ostree_repo_write_metadata_trusted ()">ostree_repo_write_metadata_trusted</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-metadata-trusted" title="ostree_repo_write_metadata_trusted ()">ostree_repo_write_metadata_trusted</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#ostree-repo-write-mtree" title="ostree_repo_write_mtree ()">ostree_repo_write_mtree</a>, function in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#ostree-repo-write-mtree" title="ostree_repo_write_mtree ()">ostree_repo_write_mtree</a>, function in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<a name="idxS"></a><h3 class="title">S</h3>
|
<a name="idxS"></a><h3 class="title">S</h3>
|
||||||
|
|
@ -1263,7 +1263,7 @@ OSTREE_RELEASE_VERSION, macro in ostree-version
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
<a class="link" href="ostree-Content-addressed-object-store.html#OstreeStaticDeltaGenerateOpt" title="enum OstreeStaticDeltaGenerateOpt">OstreeStaticDeltaGenerateOpt</a>, enum in <a class="link" href="ostree-Content-addressed-object-store.html" title="Content-addressed object store">Content-addressed object store</a>
|
<a class="link" href="ostree-OstreeRepo.html#OstreeStaticDeltaGenerateOpt" title="enum OstreeStaticDeltaGenerateOpt">OstreeStaticDeltaGenerateOpt</a>, enum in <a class="link" href="ostree-OstreeRepo.html" title="OstreeRepo: Content-addressed object store">OstreeRepo</a>
|
||||||
</dt>
|
</dt>
|
||||||
<dd></dd>
|
<dd></dd>
|
||||||
<dt>
|
<dt>
|
||||||
|
|
|
||||||
|
|
@ -268,6 +268,7 @@ ostree_mutable_tree_get_type
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
<FILE>ostree-repo</FILE>
|
<FILE>ostree-repo</FILE>
|
||||||
|
<TITLE>OstreeRepo</TITLE>
|
||||||
OstreeRepo
|
OstreeRepo
|
||||||
OstreeRepoMode
|
OstreeRepoMode
|
||||||
ostree_repo_mode_from_string
|
ostree_repo_mode_from_string
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
2017.10
|
2017.11
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
#!/bin/bash
|
|
||||||
#
|
|
||||||
# bash completion file for ostree commands
|
# bash completion file for ostree commands
|
||||||
#
|
#
|
||||||
# This script provides completion of:
|
# This script provides completion of:
|
||||||
|
|
@ -253,6 +251,9 @@ _ostree_admin_deploy() {
|
||||||
local boolean_options="
|
local boolean_options="
|
||||||
$main_boolean_options
|
$main_boolean_options
|
||||||
--retain
|
--retain
|
||||||
|
--retain-pending
|
||||||
|
--retain-rollback
|
||||||
|
--not-as-default
|
||||||
--karg-proc-cmdline
|
--karg-proc-cmdline
|
||||||
"
|
"
|
||||||
|
|
||||||
|
|
@ -695,6 +696,7 @@ _ostree_checkout() {
|
||||||
--require-hardlinks -H
|
--require-hardlinks -H
|
||||||
--union
|
--union
|
||||||
--union-add
|
--union-add
|
||||||
|
--union-identical
|
||||||
--user-mode -U
|
--user-mode -U
|
||||||
--whiteouts
|
--whiteouts
|
||||||
"
|
"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Guess values for system-dependent variables and create Makefiles.
|
# Guess values for system-dependent variables and create Makefiles.
|
||||||
# Generated by GNU Autoconf 2.69 for libostree 2017.10.
|
# Generated by GNU Autoconf 2.69 for libostree 2017.11.
|
||||||
#
|
#
|
||||||
# Report bugs to <walters@verbum.org>.
|
# Report bugs to <walters@verbum.org>.
|
||||||
#
|
#
|
||||||
|
|
@ -590,8 +590,8 @@ MAKEFLAGS=
|
||||||
# Identity of this package.
|
# Identity of this package.
|
||||||
PACKAGE_NAME='libostree'
|
PACKAGE_NAME='libostree'
|
||||||
PACKAGE_TARNAME='libostree'
|
PACKAGE_TARNAME='libostree'
|
||||||
PACKAGE_VERSION='2017.10'
|
PACKAGE_VERSION='2017.11'
|
||||||
PACKAGE_STRING='libostree 2017.10'
|
PACKAGE_STRING='libostree 2017.11'
|
||||||
PACKAGE_BUGREPORT='walters@verbum.org'
|
PACKAGE_BUGREPORT='walters@verbum.org'
|
||||||
PACKAGE_URL=''
|
PACKAGE_URL=''
|
||||||
|
|
||||||
|
|
@ -1537,7 +1537,7 @@ if test "$ac_init_help" = "long"; then
|
||||||
# Omit some internal or obsolete options to make the list less imposing.
|
# Omit some internal or obsolete options to make the list less imposing.
|
||||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||||
cat <<_ACEOF
|
cat <<_ACEOF
|
||||||
\`configure' configures libostree 2017.10 to adapt to many kinds of systems.
|
\`configure' configures libostree 2017.11 to adapt to many kinds of systems.
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||||
|
|
||||||
|
|
@ -1607,7 +1607,7 @@ fi
|
||||||
|
|
||||||
if test -n "$ac_init_help"; then
|
if test -n "$ac_init_help"; then
|
||||||
case $ac_init_help in
|
case $ac_init_help in
|
||||||
short | recursive ) echo "Configuration of libostree 2017.10:";;
|
short | recursive ) echo "Configuration of libostree 2017.11:";;
|
||||||
esac
|
esac
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
|
|
||||||
|
|
@ -1846,7 +1846,7 @@ fi
|
||||||
test -n "$ac_init_help" && exit $ac_status
|
test -n "$ac_init_help" && exit $ac_status
|
||||||
if $ac_init_version; then
|
if $ac_init_version; then
|
||||||
cat <<\_ACEOF
|
cat <<\_ACEOF
|
||||||
libostree configure 2017.10
|
libostree configure 2017.11
|
||||||
generated by GNU Autoconf 2.69
|
generated by GNU Autoconf 2.69
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||||
|
|
@ -2261,7 +2261,7 @@ cat >config.log <<_ACEOF
|
||||||
This file contains any messages produced by compilers while
|
This file contains any messages produced by compilers while
|
||||||
running configure, to aid debugging if configure makes a mistake.
|
running configure, to aid debugging if configure makes a mistake.
|
||||||
|
|
||||||
It was created by libostree $as_me 2017.10, which was
|
It was created by libostree $as_me 2017.11, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
$ $0 $@
|
$ $0 $@
|
||||||
|
|
@ -3129,7 +3129,7 @@ fi
|
||||||
|
|
||||||
# Define the identity of the package.
|
# Define the identity of the package.
|
||||||
PACKAGE='libostree'
|
PACKAGE='libostree'
|
||||||
VERSION='2017.10'
|
VERSION='2017.11'
|
||||||
|
|
||||||
|
|
||||||
# Some tools Automake needs.
|
# Some tools Automake needs.
|
||||||
|
|
@ -5863,9 +5863,9 @@ test -n "$YACC" || YACC="yacc"
|
||||||
|
|
||||||
YEAR_VERSION=2017
|
YEAR_VERSION=2017
|
||||||
|
|
||||||
RELEASE_VERSION=10
|
RELEASE_VERSION=11
|
||||||
|
|
||||||
PACKAGE_VERSION=2017.10
|
PACKAGE_VERSION=2017.11
|
||||||
|
|
||||||
|
|
||||||
if echo "$CFLAGS" | grep -q -E -e '-Werror($| )'; then :
|
if echo "$CFLAGS" | grep -q -E -e '-Werror($| )'; then :
|
||||||
|
|
@ -5884,6 +5884,7 @@ else
|
||||||
-Werror=pointer-arith -Werror=init-self \
|
-Werror=pointer-arith -Werror=init-self \
|
||||||
-Werror=missing-declarations \
|
-Werror=missing-declarations \
|
||||||
-Werror=return-type \
|
-Werror=return-type \
|
||||||
|
-Werror=switch \
|
||||||
-Werror=overflow \
|
-Werror=overflow \
|
||||||
-Werror=int-conversion \
|
-Werror=int-conversion \
|
||||||
-Werror=parenthesis \
|
-Werror=parenthesis \
|
||||||
|
|
@ -18029,7 +18030,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
# report actual input values of CONFIG_FILES etc. instead of their
|
||||||
# values after options handling.
|
# values after options handling.
|
||||||
ac_log="
|
ac_log="
|
||||||
This file was extended by libostree $as_me 2017.10, which was
|
This file was extended by libostree $as_me 2017.11, which was
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
generated by GNU Autoconf 2.69. Invocation command line was
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
CONFIG_FILES = $CONFIG_FILES
|
||||||
|
|
@ -18095,7 +18096,7 @@ _ACEOF
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||||
ac_cs_version="\\
|
ac_cs_version="\\
|
||||||
libostree config.status 2017.10
|
libostree config.status 2017.11
|
||||||
configured by $0, generated by GNU Autoconf 2.69,
|
configured by $0, generated by GNU Autoconf 2.69,
|
||||||
with options \\"\$ac_cs_config\\"
|
with options \\"\$ac_cs_config\\"
|
||||||
|
|
||||||
|
|
@ -19785,7 +19786,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
libOSTree $VERSION ($release_build_type)
|
libostree $VERSION ($release_build_type)
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ dnl update libostree-released.sym from libostree-devel.sym, and update the check
|
||||||
dnl in test-symbols.sh, and also set is_release_build=yes below. Then make
|
dnl in test-symbols.sh, and also set is_release_build=yes below. Then make
|
||||||
dnl another post-release commit to bump the version, and set is_release_build=no.
|
dnl another post-release commit to bump the version, and set is_release_build=no.
|
||||||
m4_define([year_version], [2017])
|
m4_define([year_version], [2017])
|
||||||
m4_define([release_version], [10])
|
m4_define([release_version], [11])
|
||||||
m4_define([package_version], [year_version.release_version])
|
m4_define([package_version], [year_version.release_version])
|
||||||
AC_INIT([libostree], [package_version], [walters@verbum.org])
|
AC_INIT([libostree], [package_version], [walters@verbum.org])
|
||||||
is_release_build=yes
|
is_release_build=yes
|
||||||
|
|
@ -40,6 +40,7 @@ CC_CHECK_FLAGS_APPEND([WARN_CFLAGS], [CFLAGS], [\
|
||||||
-Werror=pointer-arith -Werror=init-self \
|
-Werror=pointer-arith -Werror=init-self \
|
||||||
-Werror=missing-declarations \
|
-Werror=missing-declarations \
|
||||||
-Werror=return-type \
|
-Werror=return-type \
|
||||||
|
-Werror=switch \
|
||||||
-Werror=overflow \
|
-Werror=overflow \
|
||||||
-Werror=int-conversion \
|
-Werror=int-conversion \
|
||||||
-Werror=parenthesis \
|
-Werror=parenthesis \
|
||||||
|
|
@ -525,7 +526,7 @@ src/libostree/ostree-version.h
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
echo "
|
echo "
|
||||||
libOSTree $VERSION ($release_build_type)
|
libostree $VERSION ($release_build_type)
|
||||||
===============
|
===============
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,30 @@ Boston, MA 02111-1307, USA.
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--retain-pending</option></term>
|
||||||
|
|
||||||
|
<listitem><para>
|
||||||
|
Do not delete pending deployments.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--retain-rollback</option></term>
|
||||||
|
|
||||||
|
<listitem><para>
|
||||||
|
Do not delete rollback deployments.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--not-as-default</option></term>
|
||||||
|
|
||||||
|
<listitem><para>
|
||||||
|
Append rather than prepend new deployment.
|
||||||
|
</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>--karg-proc-cmdline</option></term>
|
<term><option>--karg-proc-cmdline</option></term>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,15 @@ Boston, MA 02111-1307, USA.
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--union-identical</option></term>
|
||||||
|
|
||||||
|
<listitem><para>Like <literal>--union</literal>, but error out
|
||||||
|
if a file would be replaced with a different file. Add new files
|
||||||
|
and directories, ignore identical files, and keep existing
|
||||||
|
directories. Requires <literal>-H</literal>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>--allow-noent</option></term>
|
<term><option>--allow-noent</option></term>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,9 +67,13 @@ Boston, MA 02111-1307, USA.
|
||||||
<variablelist>
|
<variablelist>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><option>--mode</option>="MODE"</term>
|
<term><option>--mode</option>="MODE"</term>
|
||||||
<listitem><para>
|
<listitem><para> Initialize repository in given mode
|
||||||
Initialize repository in given mode (bare, bare-user, archive-z2). Default is "bare".
|
(<literal>bare</literal>, <literal>bare-user</literal>,
|
||||||
</para></listitem>
|
<literal>archive</literal>). The default is
|
||||||
|
<literal>bare</literal>. Note that for
|
||||||
|
<literal>archive</literal> the repository configuration file
|
||||||
|
will actually have <literal>archive-z2</literal>, as that's the
|
||||||
|
historical name.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
|
|
|
||||||
|
|
@ -103,7 +103,12 @@ Boston, MA 02111-1307, USA.
|
||||||
<term><option>--mirror</option></term>
|
<term><option>--mirror</option></term>
|
||||||
|
|
||||||
<listitem><para>
|
<listitem><para>
|
||||||
Write refs suitable for a mirror.
|
Write refs suitable for a mirror, i.e. refs are stored in the
|
||||||
|
<literal>heads/</literal> directory rather than the
|
||||||
|
<literal>remotes/</literal> directory. This makes the target repo
|
||||||
|
suitable to be exported for other clients to pull from as an ostree
|
||||||
|
remote. If no specific refs are specified, all refs will be fetched (the
|
||||||
|
remote must have a summary file present).
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
|
@ -152,7 +157,7 @@ Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
<para>Perform a complete mirror of the remote. (This is
|
<para>Perform a complete mirror of the remote. (This is
|
||||||
likely most useful if your repository is also
|
likely most useful if your repository is also
|
||||||
<literal>archive-z2</literal> mode)</para>
|
<literal>archive</literal> mode)</para>
|
||||||
|
|
||||||
<para><command>$ ostree --repo=repo pull remote_name exampleos/x86_64/standard</command></para>
|
<para><command>$ ostree --repo=repo pull remote_name exampleos/x86_64/standard</command></para>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ Boston, MA 02111-1307, USA.
|
||||||
<variablelist>
|
<variablelist>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>mode</varname></term>
|
<term><varname>mode</varname></term>
|
||||||
<listitem><para>One of <literal>bare</literal>, <literal>bare-user</literal> or <literal>archive-z2</literal>. </para></listitem>
|
<listitem><para>One of <literal>bare</literal>, <literal>bare-user</literal> or <literal>archive-z2</literal> (note that <literal>archive</literal> is used everywhere else.)</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
|
|
@ -122,6 +122,27 @@ Boston, MA 02111-1307, USA.
|
||||||
keep free. The default value is 3.</para></listitem>
|
keep free. The default value is 3.</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>add-remotes-config-dir</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Boolean value controlling whether new remotes will be added
|
||||||
|
in the remotes configuration directory. Defaults to
|
||||||
|
<literal>true</literal> for system ostree repositories. When
|
||||||
|
this is <literal>false</literal>, remotes will be added in
|
||||||
|
the repository's <filename>config</filename> file.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This only applies to repositories that use a remotes
|
||||||
|
configuration directory such as system ostree repositories,
|
||||||
|
which use <filename>/etc/ostree/remotes.d</filename>.
|
||||||
|
Non-system repositories do not use a remotes configuration
|
||||||
|
directory unless one is specified when the repository is
|
||||||
|
opened.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Copyright (C) 2017 Colin Walters <walters@verbum.org>
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# https://github.com/ostreedev/ostree/issues/393
|
||||||
|
R! /var/tmp/ostree-unlock-ovl.*
|
||||||
|
|
@ -18,6 +18,9 @@
|
||||||
***/
|
***/
|
||||||
|
|
||||||
/* Add new symbols here. Release commits should copy this section into -released.sym. */
|
/* Add new symbols here. Release commits should copy this section into -released.sym. */
|
||||||
|
LIBOSTREE_2017.12 {
|
||||||
|
} LIBOSTREE_2017.11;
|
||||||
|
|
||||||
|
|
||||||
/* Stub section for the stable release *after* this development one; don't
|
/* Stub section for the stable release *after* this development one; don't
|
||||||
* edit this other than to update the last number. This is just a copy/paste
|
* edit this other than to update the last number. This is just a copy/paste
|
||||||
|
|
|
||||||
|
|
@ -427,6 +427,9 @@ LIBOSTREE_2017.10 {
|
||||||
*/
|
*/
|
||||||
} LIBOSTREE_2017.8;
|
} LIBOSTREE_2017.8;
|
||||||
|
|
||||||
|
LIBOSTREE_2017.11 {
|
||||||
|
} LIBOSTREE_2017.10;
|
||||||
|
|
||||||
/* NOTE: Only add more content here in release commits! See the
|
/* NOTE: Only add more content here in release commits! See the
|
||||||
* comments at the top of this file.
|
* comments at the top of this file.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -75,18 +75,17 @@ _ostree_bootloader_grub2_query (OstreeBootloader *bootloader,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
OstreeBootloaderGrub2 *self = OSTREE_BOOTLOADER_GRUB2 (bootloader);
|
OstreeBootloaderGrub2 *self = OSTREE_BOOTLOADER_GRUB2 (bootloader);
|
||||||
g_autoptr(GFile) efi_basedir = NULL;
|
|
||||||
|
|
||||||
|
/* Look for the BIOS path first */
|
||||||
if (g_file_query_exists (self->config_path_bios, NULL))
|
if (g_file_query_exists (self->config_path_bios, NULL))
|
||||||
{
|
{
|
||||||
|
/* If we found it, we're done */
|
||||||
*out_is_active = TRUE;
|
*out_is_active = TRUE;
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
efi_basedir = g_file_resolve_relative_path (self->sysroot->path, "boot/efi/EFI");
|
g_autoptr(GFile) efi_basedir = g_file_resolve_relative_path (self->sysroot->path, "boot/efi/EFI");
|
||||||
|
|
||||||
g_clear_object (&self->config_path_efi);
|
g_clear_object (&self->config_path_efi);
|
||||||
|
|
||||||
|
|
@ -98,17 +97,16 @@ _ostree_bootloader_grub2_query (OstreeBootloader *bootloader,
|
||||||
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
|
||||||
cancellable, error);
|
cancellable, error);
|
||||||
if (!direnum)
|
if (!direnum)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
GFileInfo *file_info;
|
GFileInfo *file_info;
|
||||||
const char *fname;
|
const char *fname;
|
||||||
g_autofree char *subdir_grub_cfg = NULL;
|
|
||||||
|
|
||||||
if (!g_file_enumerator_iterate (direnum, &file_info, NULL,
|
if (!g_file_enumerator_iterate (direnum, &file_info, NULL,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (file_info == NULL)
|
if (file_info == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
@ -119,7 +117,8 @@ _ostree_bootloader_grub2_query (OstreeBootloader *bootloader,
|
||||||
if (g_file_info_get_file_type (file_info) != G_FILE_TYPE_DIRECTORY)
|
if (g_file_info_get_file_type (file_info) != G_FILE_TYPE_DIRECTORY)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
subdir_grub_cfg = g_build_filename (gs_file_get_path_cached (efi_basedir), fname, "grub.cfg", NULL);
|
g_autofree char *subdir_grub_cfg =
|
||||||
|
g_build_filename (gs_file_get_path_cached (efi_basedir), fname, "grub.cfg", NULL);
|
||||||
|
|
||||||
if (g_file_test (subdir_grub_cfg, G_FILE_TEST_EXISTS))
|
if (g_file_test (subdir_grub_cfg, G_FILE_TEST_EXISTS))
|
||||||
{
|
{
|
||||||
|
|
@ -128,20 +127,18 @@ _ostree_bootloader_grub2_query (OstreeBootloader *bootloader,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we found the EFI path, we're done */
|
||||||
if (self->config_path_efi)
|
if (self->config_path_efi)
|
||||||
{
|
{
|
||||||
self->is_efi = TRUE;
|
self->is_efi = TRUE;
|
||||||
*out_is_active = TRUE;
|
*out_is_active = TRUE;
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*out_is_active = FALSE;
|
*out_is_active = FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
|
|
@ -150,6 +147,10 @@ _ostree_bootloader_grub2_get_name (OstreeBootloader *bootloader)
|
||||||
return "grub2";
|
return "grub2";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This implementation is quite complex; see this issue for
|
||||||
|
* a starting point:
|
||||||
|
* https://github.com/ostreedev/ostree/issues/717
|
||||||
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
_ostree_bootloader_grub2_generate_config (OstreeSysroot *sysroot,
|
_ostree_bootloader_grub2_generate_config (OstreeSysroot *sysroot,
|
||||||
int bootversion,
|
int bootversion,
|
||||||
|
|
@ -157,13 +158,6 @@ _ostree_bootloader_grub2_generate_config (OstreeSysroot *sysroot
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
g_autoptr(GString) output = g_string_new ("");
|
|
||||||
g_autoptr(GOutputStream) out_stream = NULL;
|
|
||||||
g_autoptr(GPtrArray) loader_configs = NULL;
|
|
||||||
guint i;
|
|
||||||
gsize bytes_written;
|
|
||||||
gboolean is_efi;
|
|
||||||
/* So... yeah. Just going to hardcode these. */
|
/* So... yeah. Just going to hardcode these. */
|
||||||
static const char hardcoded_video[] = "load_video\n"
|
static const char hardcoded_video[] = "load_video\n"
|
||||||
"set gfxpayload=keep\n";
|
"set gfxpayload=keep\n";
|
||||||
|
|
@ -178,16 +172,18 @@ _ostree_bootloader_grub2_generate_config (OstreeSysroot *sysroot
|
||||||
g_assert (grub2_prepare_root_cache != NULL);
|
g_assert (grub2_prepare_root_cache != NULL);
|
||||||
|
|
||||||
/* Passed from the parent */
|
/* Passed from the parent */
|
||||||
is_efi = g_getenv ("_OSTREE_GRUB2_IS_EFI") != NULL;
|
gboolean is_efi = g_getenv ("_OSTREE_GRUB2_IS_EFI") != NULL;
|
||||||
|
|
||||||
out_stream = g_unix_output_stream_new (target_fd, FALSE);
|
g_autoptr(GOutputStream) out_stream = g_unix_output_stream_new (target_fd, FALSE);
|
||||||
|
|
||||||
|
g_autoptr(GPtrArray) loader_configs = NULL;
|
||||||
if (!_ostree_sysroot_read_boot_loader_configs (sysroot, bootversion,
|
if (!_ostree_sysroot_read_boot_loader_configs (sysroot, bootversion,
|
||||||
&loader_configs,
|
&loader_configs,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
for (i = 0; i < loader_configs->len; i++)
|
g_autoptr(GString) output = g_string_new ("");
|
||||||
|
for (guint i = 0; i < loader_configs->len; i++)
|
||||||
{
|
{
|
||||||
OstreeBootconfigParser *config = loader_configs->pdata[i];
|
OstreeBootconfigParser *config = loader_configs->pdata[i];
|
||||||
const char *title;
|
const char *title;
|
||||||
|
|
@ -219,11 +215,7 @@ _ostree_bootloader_grub2_generate_config (OstreeSysroot *sysroot
|
||||||
g_string_append_c (output, '\n');
|
g_string_append_c (output, '\n');
|
||||||
|
|
||||||
if (!kernel)
|
if (!kernel)
|
||||||
{
|
return glnx_throw (error, "No \"linux\" key in bootloader config");
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"No \"linux\" key in bootloader config");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
g_string_append (output, "linux");
|
g_string_append (output, "linux");
|
||||||
if (is_efi)
|
if (is_efi)
|
||||||
g_string_append (output, GRUB2_EFI_SUFFIX);
|
g_string_append (output, GRUB2_EFI_SUFFIX);
|
||||||
|
|
@ -256,13 +248,12 @@ _ostree_bootloader_grub2_generate_config (OstreeSysroot *sysroot
|
||||||
g_string_append (output, "}\n");
|
g_string_append (output, "}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gsize bytes_written;
|
||||||
if (!g_output_stream_write_all (out_stream, output->str, output->len,
|
if (!g_output_stream_write_all (out_stream, output->str, output->len,
|
||||||
&bytes_written, cancellable, error))
|
&bytes_written, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
@ -271,19 +262,24 @@ typedef struct {
|
||||||
gboolean is_efi;
|
gboolean is_efi;
|
||||||
} Grub2ChildSetupData;
|
} Grub2ChildSetupData;
|
||||||
|
|
||||||
|
/* Post-fork, pre-exec child setup for grub2-mkconfig */
|
||||||
static void
|
static void
|
||||||
grub2_child_setup (gpointer user_data)
|
grub2_child_setup (gpointer user_data)
|
||||||
{
|
{
|
||||||
Grub2ChildSetupData *cdata = user_data;
|
Grub2ChildSetupData *cdata = user_data;
|
||||||
|
|
||||||
setenv ("_OSTREE_GRUB2_BOOTVERSION", cdata->bootversion_str, TRUE);
|
setenv ("_OSTREE_GRUB2_BOOTVERSION", cdata->bootversion_str, TRUE);
|
||||||
/* We have to pass our state to the child */
|
/* We have to pass our state (whether or not we're using EFI) to the child */
|
||||||
if (cdata->is_efi)
|
if (cdata->is_efi)
|
||||||
setenv ("_OSTREE_GRUB2_IS_EFI", "1", TRUE);
|
setenv ("_OSTREE_GRUB2_IS_EFI", "1", TRUE);
|
||||||
|
|
||||||
|
/* Everything below this is dealing with the chroot case; if
|
||||||
|
* we're not doing that, return early.
|
||||||
|
*/
|
||||||
if (!cdata->root)
|
if (!cdata->root)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* TODO: investigate replacing this with bwrap */
|
||||||
if (chdir (cdata->root) != 0)
|
if (chdir (cdata->root) != 0)
|
||||||
{
|
{
|
||||||
perror ("chdir");
|
perror ("chdir");
|
||||||
|
|
@ -321,6 +317,7 @@ grub2_child_setup (gpointer user_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Main entrypoint for writing GRUB configuration. */
|
||||||
static gboolean
|
static gboolean
|
||||||
_ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
|
_ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
|
||||||
int bootversion,
|
int bootversion,
|
||||||
|
|
@ -328,23 +325,13 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
OstreeBootloaderGrub2 *self = OSTREE_BOOTLOADER_GRUB2 (bootloader);
|
OstreeBootloaderGrub2 *self = OSTREE_BOOTLOADER_GRUB2 (bootloader);
|
||||||
gboolean ret = FALSE;
|
|
||||||
g_autoptr(GFile) new_config_path = NULL;
|
|
||||||
g_autofree char *bootversion_str = g_strdup_printf ("%u", (guint)bootversion);
|
|
||||||
g_autoptr(GFile) config_path_efi_dir = NULL;
|
|
||||||
g_autofree char *grub2_mkconfig_chroot = NULL;
|
|
||||||
gboolean use_system_grub2_mkconfig = TRUE;
|
|
||||||
const gchar *grub_exec = NULL;
|
|
||||||
const char *grub_argv[4] = { NULL, "-o", NULL, NULL};
|
|
||||||
GSpawnFlags grub_spawnflags = G_SPAWN_SEARCH_PATH;
|
|
||||||
int grub2_estatus;
|
|
||||||
Grub2ChildSetupData cdata = { NULL, };
|
|
||||||
|
|
||||||
|
/* Autotests can set this envvar to select which code path to test, useful for OS installers as well */
|
||||||
|
gboolean use_system_grub2_mkconfig = TRUE;
|
||||||
#ifdef USE_BUILTIN_GRUB2_MKCONFIG
|
#ifdef USE_BUILTIN_GRUB2_MKCONFIG
|
||||||
use_system_grub2_mkconfig = FALSE;
|
use_system_grub2_mkconfig = FALSE;
|
||||||
#endif
|
#endif
|
||||||
/* Autotests can set this envvar to select which code path to test, useful for OS installers as well */
|
const gchar *grub_exec = g_getenv ("OSTREE_GRUB2_EXEC");
|
||||||
grub_exec = g_getenv ("OSTREE_GRUB2_EXEC");
|
|
||||||
if (grub_exec)
|
if (grub_exec)
|
||||||
{
|
{
|
||||||
if (g_str_has_suffix (grub_exec, GRUB2_MKCONFIG_PATH))
|
if (g_str_has_suffix (grub_exec, GRUB2_MKCONFIG_PATH))
|
||||||
|
|
@ -355,6 +342,7 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
|
||||||
else
|
else
|
||||||
grub_exec = use_system_grub2_mkconfig ? GRUB2_MKCONFIG_PATH : TARGET_PREFIX "/lib/ostree/ostree-grub-generator";
|
grub_exec = use_system_grub2_mkconfig ? GRUB2_MKCONFIG_PATH : TARGET_PREFIX "/lib/ostree/ostree-grub-generator";
|
||||||
|
|
||||||
|
g_autofree char *grub2_mkconfig_chroot = NULL;
|
||||||
if (use_system_grub2_mkconfig && ostree_sysroot_get_booted_deployment (self->sysroot) == NULL
|
if (use_system_grub2_mkconfig && ostree_sysroot_get_booted_deployment (self->sysroot) == NULL
|
||||||
&& g_file_has_parent (self->sysroot->path, NULL))
|
&& g_file_has_parent (self->sysroot->path, NULL))
|
||||||
{
|
{
|
||||||
|
|
@ -381,13 +369,15 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
|
||||||
grub2_mkconfig_chroot = g_file_get_path (tool_deployment_root);
|
grub2_mkconfig_chroot = g_file_get_path (tool_deployment_root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_autoptr(GFile) new_config_path = NULL;
|
||||||
|
g_autoptr(GFile) config_path_efi_dir = NULL;
|
||||||
if (self->is_efi)
|
if (self->is_efi)
|
||||||
{
|
{
|
||||||
config_path_efi_dir = g_file_get_parent (self->config_path_efi);
|
config_path_efi_dir = g_file_get_parent (self->config_path_efi);
|
||||||
new_config_path = g_file_get_child (config_path_efi_dir, "grub.cfg.new");
|
new_config_path = g_file_get_child (config_path_efi_dir, "grub.cfg.new");
|
||||||
/* We use grub2-mkconfig to write to a temporary file first */
|
/* We use grub2-mkconfig to write to a temporary file first */
|
||||||
if (!ot_gfile_ensure_unlinked (new_config_path, cancellable, error))
|
if (!ot_gfile_ensure_unlinked (new_config_path, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -395,12 +385,16 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
|
||||||
bootversion);
|
bootversion);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *grub_argv[4] = { NULL, "-o", NULL, NULL};
|
||||||
|
Grub2ChildSetupData cdata = { NULL, };
|
||||||
grub_argv[0] = grub_exec;
|
grub_argv[0] = grub_exec;
|
||||||
grub_argv[2] = gs_file_get_path_cached (new_config_path);
|
grub_argv[2] = gs_file_get_path_cached (new_config_path);
|
||||||
|
|
||||||
|
GSpawnFlags grub_spawnflags = G_SPAWN_SEARCH_PATH;
|
||||||
if (!g_getenv ("OSTREE_DEBUG_GRUB2"))
|
if (!g_getenv ("OSTREE_DEBUG_GRUB2"))
|
||||||
grub_spawnflags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
|
grub_spawnflags |= G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL;
|
||||||
cdata.root = grub2_mkconfig_chroot;
|
cdata.root = grub2_mkconfig_chroot;
|
||||||
|
g_autofree char *bootversion_str = g_strdup_printf ("%u", (guint)bootversion);
|
||||||
cdata.bootversion_str = bootversion_str;
|
cdata.bootversion_str = bootversion_str;
|
||||||
cdata.is_efi = self->is_efi;
|
cdata.is_efi = self->is_efi;
|
||||||
/* Note in older versions of the grub2 package, this script doesn't even try
|
/* Note in older versions of the grub2 package, this script doesn't even try
|
||||||
|
|
@ -411,26 +405,24 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
|
||||||
|
|
||||||
Upstream is fixed though.
|
Upstream is fixed though.
|
||||||
*/
|
*/
|
||||||
|
int grub2_estatus;
|
||||||
if (!g_spawn_sync (NULL, (char**)grub_argv, NULL, grub_spawnflags,
|
if (!g_spawn_sync (NULL, (char**)grub_argv, NULL, grub_spawnflags,
|
||||||
grub2_child_setup, &cdata, NULL, NULL,
|
grub2_child_setup, &cdata, NULL, NULL,
|
||||||
&grub2_estatus, error))
|
&grub2_estatus, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (!g_spawn_check_exit_status (grub2_estatus, error))
|
if (!g_spawn_check_exit_status (grub2_estatus, error))
|
||||||
{
|
{
|
||||||
g_prefix_error (error, "%s: ", grub_argv[0]);
|
g_prefix_error (error, "%s: ", grub_argv[0]);
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now let's fdatasync() for the new file */
|
/* Now let's fdatasync() for the new file */
|
||||||
{ glnx_fd_close int new_config_fd = -1;
|
{ glnx_fd_close int new_config_fd = -1;
|
||||||
if (!glnx_openat_rdonly (AT_FDCWD, gs_file_get_path_cached (new_config_path), TRUE, &new_config_fd, error))
|
if (!glnx_openat_rdonly (AT_FDCWD, gs_file_get_path_cached (new_config_path), TRUE, &new_config_fd, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (fdatasync (new_config_fd) < 0)
|
if (fdatasync (new_config_fd) < 0)
|
||||||
{
|
return glnx_throw_errno_prefix (error, "fdatasync");
|
||||||
(void)glnx_throw_errno_prefix (error, "fdatasync");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->is_efi)
|
if (self->is_efi)
|
||||||
|
|
@ -439,26 +431,21 @@ _ostree_bootloader_grub2_write_config (OstreeBootloader *bootloader,
|
||||||
|
|
||||||
/* copy current to old */
|
/* copy current to old */
|
||||||
if (!ot_gfile_ensure_unlinked (config_path_efi_old, cancellable, error))
|
if (!ot_gfile_ensure_unlinked (config_path_efi_old, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (!g_file_copy (self->config_path_efi, config_path_efi_old,
|
if (!g_file_copy (self->config_path_efi, config_path_efi_old,
|
||||||
G_FILE_COPY_OVERWRITE, cancellable, NULL, NULL, error))
|
G_FILE_COPY_OVERWRITE, cancellable, NULL, NULL, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
/* NOTE: NON-ATOMIC REPLACEMENT; WE can't do anything else on FAT;
|
/* NOTE: NON-ATOMIC REPLACEMENT; WE can't do anything else on FAT;
|
||||||
* see https://bugzilla.gnome.org/show_bug.cgi?id=724246
|
* see https://bugzilla.gnome.org/show_bug.cgi?id=724246
|
||||||
*/
|
*/
|
||||||
if (!ot_gfile_ensure_unlinked (self->config_path_efi, cancellable, error))
|
if (!ot_gfile_ensure_unlinked (self->config_path_efi, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (rename (gs_file_get_path_cached (new_config_path), gs_file_get_path_cached (self->config_path_efi)) < 0)
|
if (rename (gs_file_get_path_cached (new_config_path), gs_file_get_path_cached (self->config_path_efi)) < 0)
|
||||||
{
|
return glnx_throw_errno_prefix (error, "rename");
|
||||||
glnx_set_error_from_errno (error);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
|
||||||
|
|
@ -59,44 +59,33 @@ _ostree_bootloader_syslinux_get_name (OstreeBootloader *bootloader)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
append_config_from_boostree_loader_entries (OstreeBootloaderSyslinux *self,
|
append_config_from_loader_entries (OstreeBootloaderSyslinux *self,
|
||||||
gboolean regenerate_default,
|
gboolean regenerate_default,
|
||||||
int bootversion,
|
int bootversion,
|
||||||
GPtrArray *new_lines,
|
GPtrArray *new_lines,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
g_autoptr(GPtrArray) loader_configs = NULL;
|
||||||
g_autoptr(GPtrArray) boostree_loader_configs = NULL;
|
if (!_ostree_sysroot_read_boot_loader_configs (self->sysroot, bootversion, &loader_configs,
|
||||||
guint i;
|
|
||||||
|
|
||||||
if (!_ostree_sysroot_read_boot_loader_configs (self->sysroot, bootversion, &boostree_loader_configs,
|
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
for (i = 0; i < boostree_loader_configs->len; i++)
|
for (guint i = 0; i < loader_configs->len; i++)
|
||||||
{
|
{
|
||||||
OstreeBootconfigParser *config = boostree_loader_configs->pdata[i];
|
OstreeBootconfigParser *config = loader_configs->pdata[i];
|
||||||
const char *val;
|
const char *val = ostree_bootconfig_parser_get (config, "title");
|
||||||
|
|
||||||
val = ostree_bootconfig_parser_get (config, "title");
|
|
||||||
if (!val)
|
if (!val)
|
||||||
val = "(Untitled)";
|
val = "(Untitled)";
|
||||||
|
|
||||||
if (regenerate_default && i == 0)
|
if (regenerate_default && i == 0)
|
||||||
{
|
|
||||||
g_ptr_array_add (new_lines, g_strdup_printf ("DEFAULT %s", val));
|
g_ptr_array_add (new_lines, g_strdup_printf ("DEFAULT %s", val));
|
||||||
}
|
|
||||||
|
|
||||||
g_ptr_array_add (new_lines, g_strdup_printf ("LABEL %s", val));
|
g_ptr_array_add (new_lines, g_strdup_printf ("LABEL %s", val));
|
||||||
|
|
||||||
val = ostree_bootconfig_parser_get (config, "linux");
|
val = ostree_bootconfig_parser_get (config, "linux");
|
||||||
if (!val)
|
if (!val)
|
||||||
{
|
return glnx_throw (error, "No \"linux\" key in bootloader config");
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"No \"linux\" key in bootloader config");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
g_ptr_array_add (new_lines, g_strdup_printf ("\tKERNEL %s", val));
|
g_ptr_array_add (new_lines, g_strdup_printf ("\tKERNEL %s", val));
|
||||||
|
|
||||||
val = ostree_bootconfig_parser_get (config, "initrd");
|
val = ostree_bootconfig_parser_get (config, "initrd");
|
||||||
|
|
@ -108,9 +97,7 @@ append_config_from_boostree_loader_entries (OstreeBootloaderSyslinux *self,
|
||||||
g_ptr_array_add (new_lines, g_strdup_printf ("\tAPPEND %s", val));
|
g_ptr_array_add (new_lines, g_strdup_printf ("\tAPPEND %s", val));
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
@ -119,42 +106,33 @@ _ostree_bootloader_syslinux_write_config (OstreeBootloader *bootloader,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
OstreeBootloaderSyslinux *self = OSTREE_BOOTLOADER_SYSLINUX (bootloader);
|
OstreeBootloaderSyslinux *self = OSTREE_BOOTLOADER_SYSLINUX (bootloader);
|
||||||
g_autoptr(GFile) new_config_path = NULL;
|
|
||||||
g_autofree char *config_contents = NULL;
|
g_autoptr(GFile) new_config_path =
|
||||||
g_autofree char *new_config_contents = NULL;
|
ot_gfile_resolve_path_printf (self->sysroot->path, "boot/loader.%d/syslinux.cfg", bootversion);
|
||||||
g_autoptr(GPtrArray) new_lines = NULL;
|
|
||||||
g_autoptr(GPtrArray) tmp_lines = NULL;
|
/* This should follow the symbolic link to the current bootversion. */
|
||||||
|
g_autofree char *config_contents =
|
||||||
|
glnx_file_get_contents_utf8_at (AT_FDCWD, gs_file_get_path_cached (self->config_path), NULL,
|
||||||
|
cancellable, error);
|
||||||
|
if (!config_contents)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
g_auto(GStrv) lines = g_strsplit (config_contents, "\n", -1);
|
||||||
|
g_autoptr(GPtrArray) new_lines = g_ptr_array_new_with_free_func (g_free);
|
||||||
|
g_autoptr(GPtrArray) tmp_lines = g_ptr_array_new_with_free_func (g_free);
|
||||||
|
|
||||||
g_autofree char *kernel_arg = NULL;
|
g_autofree char *kernel_arg = NULL;
|
||||||
gboolean saw_default = FALSE;
|
gboolean saw_default = FALSE;
|
||||||
gboolean regenerate_default = FALSE;
|
gboolean regenerate_default = FALSE;
|
||||||
gboolean parsing_label = FALSE;
|
gboolean parsing_label = FALSE;
|
||||||
char **lines = NULL;
|
|
||||||
char **iter;
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
new_config_path = ot_gfile_resolve_path_printf (self->sysroot->path, "boot/loader.%d/syslinux.cfg",
|
|
||||||
bootversion);
|
|
||||||
|
|
||||||
/* This should follow the symbolic link to the current bootversion. */
|
|
||||||
config_contents = glnx_file_get_contents_utf8_at (AT_FDCWD, gs_file_get_path_cached (self->config_path), NULL,
|
|
||||||
cancellable, error);
|
|
||||||
if (!config_contents)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
lines = g_strsplit (config_contents, "\n", -1);
|
|
||||||
new_lines = g_ptr_array_new_with_free_func (g_free);
|
|
||||||
tmp_lines = g_ptr_array_new_with_free_func (g_free);
|
|
||||||
|
|
||||||
/* Note special iteration condition here; we want to also loop one
|
/* Note special iteration condition here; we want to also loop one
|
||||||
* more time at the end where line = NULL to ensure we finish off
|
* more time at the end where line = NULL to ensure we finish off
|
||||||
* processing the last LABEL.
|
* processing the last LABEL.
|
||||||
*/
|
*/
|
||||||
iter = lines;
|
for (char **iter = lines; iter; iter++)
|
||||||
while (TRUE)
|
|
||||||
{
|
{
|
||||||
char *line = *iter;
|
const char *line = *iter;
|
||||||
gboolean skip = FALSE;
|
gboolean skip = FALSE;
|
||||||
|
|
||||||
if (parsing_label &&
|
if (parsing_label &&
|
||||||
|
|
@ -162,18 +140,14 @@ _ostree_bootloader_syslinux_write_config (OstreeBootloader *bootloader,
|
||||||
{
|
{
|
||||||
parsing_label = FALSE;
|
parsing_label = FALSE;
|
||||||
if (kernel_arg == NULL)
|
if (kernel_arg == NULL)
|
||||||
{
|
return glnx_throw (error, "No KERNEL argument found after LABEL");
|
||||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"No KERNEL argument found after LABEL");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If this is a non-ostree kernel, just emit the lines
|
/* If this is a non-ostree kernel, just emit the lines
|
||||||
* we saw.
|
* we saw.
|
||||||
*/
|
*/
|
||||||
if (!g_str_has_prefix (kernel_arg, "/ostree/"))
|
if (!g_str_has_prefix (kernel_arg, "/ostree/"))
|
||||||
{
|
{
|
||||||
for (i = 0; i < tmp_lines->len; i++)
|
for (guint i = 0; i < tmp_lines->len; i++)
|
||||||
{
|
{
|
||||||
g_ptr_array_add (new_lines, tmp_lines->pdata[i]);
|
g_ptr_array_add (new_lines, tmp_lines->pdata[i]);
|
||||||
tmp_lines->pdata[i] = NULL; /* Transfer ownership */
|
tmp_lines->pdata[i] = NULL; /* Transfer ownership */
|
||||||
|
|
@ -211,55 +185,37 @@ _ostree_bootloader_syslinux_write_config (OstreeBootloader *bootloader,
|
||||||
* the title to hopefully avoid regressions. */
|
* the title to hopefully avoid regressions. */
|
||||||
if (g_str_has_prefix (line, "DEFAULT ostree:") || /* old format */
|
if (g_str_has_prefix (line, "DEFAULT ostree:") || /* old format */
|
||||||
strstr (line, "(ostree") != NULL) /* new format */
|
strstr (line, "(ostree") != NULL) /* new format */
|
||||||
{
|
|
||||||
regenerate_default = TRUE;
|
regenerate_default = TRUE;
|
||||||
}
|
|
||||||
skip = TRUE;
|
skip = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skip)
|
if (!skip)
|
||||||
{
|
|
||||||
g_free (line);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (parsing_label)
|
if (parsing_label)
|
||||||
{
|
g_ptr_array_add (tmp_lines, g_strdup (line));
|
||||||
g_ptr_array_add (tmp_lines, line);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
g_ptr_array_add (new_lines, g_strdup (line));
|
||||||
g_ptr_array_add (new_lines, line);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Transfer ownership */
|
|
||||||
*iter = NULL;
|
|
||||||
iter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!saw_default)
|
if (!saw_default)
|
||||||
regenerate_default = TRUE;
|
regenerate_default = TRUE;
|
||||||
|
|
||||||
if (!append_config_from_boostree_loader_entries (self, regenerate_default,
|
if (!append_config_from_loader_entries (self, regenerate_default,
|
||||||
bootversion, new_lines,
|
bootversion, new_lines,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
new_config_contents = _ostree_sysroot_join_lines (new_lines);
|
g_autofree char *new_config_contents = _ostree_sysroot_join_lines (new_lines);
|
||||||
{
|
|
||||||
g_autoptr(GBytes) new_config_contents_bytes =
|
g_autoptr(GBytes) new_config_contents_bytes =
|
||||||
g_bytes_new_static (new_config_contents,
|
g_bytes_new_static (new_config_contents,
|
||||||
strlen (new_config_contents));
|
strlen (new_config_contents));
|
||||||
|
|
||||||
if (!ot_gfile_replace_contents_fsync (new_config_path, new_config_contents_bytes,
|
if (!ot_gfile_replace_contents_fsync (new_config_path, new_config_contents_bytes,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
g_free (lines); /* Note we freed elements individually */
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,44 @@ _ostree_bootloader_uboot_get_name (OstreeBootloader *bootloader)
|
||||||
return "U-Boot";
|
return "U-Boot";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Append system's uEnv.txt, if it exists in $deployment/usr/lib/ostree-boot/ */
|
||||||
|
static gboolean
|
||||||
|
append_system_uenv (OstreeBootloaderUboot *self,
|
||||||
|
const char *bootargs,
|
||||||
|
GPtrArray *new_lines,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
glnx_fd_close int uenv_fd = -1;
|
||||||
|
__attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL;
|
||||||
|
const char *uenv_path = NULL;
|
||||||
|
const char *ostree_arg = NULL;
|
||||||
|
|
||||||
|
kargs = _ostree_kernel_args_from_string (bootargs);
|
||||||
|
ostree_arg = _ostree_kernel_args_get_last_value (kargs, "ostree");
|
||||||
|
if (!ostree_arg)
|
||||||
|
{
|
||||||
|
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"No ostree= kernel argument found in boot loader configuration file");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
ostree_arg += 1;
|
||||||
|
uenv_path = glnx_strjoina (ostree_arg, "/usr/lib/ostree-boot/uEnv.txt");
|
||||||
|
if (!ot_openat_ignore_enoent (self->sysroot->sysroot_fd, uenv_path, &uenv_fd, error))
|
||||||
|
return FALSE;
|
||||||
|
if (uenv_fd != -1)
|
||||||
|
{
|
||||||
|
char *uenv = glnx_fd_readall_utf8 (uenv_fd, NULL, cancellable, error);
|
||||||
|
if (!uenv)
|
||||||
|
{
|
||||||
|
g_prefix_error (error, "Reading %s: ", uenv_path);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
g_ptr_array_add (new_lines, uenv);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
|
create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
|
||||||
int bootversion,
|
int bootversion,
|
||||||
|
|
@ -77,8 +115,14 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* U-Boot doesn't support a menu so just pick the first one since the list is ordered */
|
for (int i = 0; i < boot_loader_configs->len; i++)
|
||||||
config = boot_loader_configs->pdata[0];
|
{
|
||||||
|
g_autofree char *index_suffix = NULL;
|
||||||
|
if (i == 0)
|
||||||
|
index_suffix = g_strdup ("");
|
||||||
|
else
|
||||||
|
index_suffix = g_strdup_printf ("%d", i+1);
|
||||||
|
config = boot_loader_configs->pdata[i];
|
||||||
|
|
||||||
val = ostree_bootconfig_parser_get (config, "linux");
|
val = ostree_bootconfig_parser_get (config, "linux");
|
||||||
if (!val)
|
if (!val)
|
||||||
|
|
@ -87,52 +131,20 @@ create_config_from_boot_loader_entries (OstreeBootloaderUboot *self,
|
||||||
"No \"linux\" key in bootloader config");
|
"No \"linux\" key in bootloader config");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
g_ptr_array_add (new_lines, g_strdup_printf ("kernel_image=%s", val));
|
g_ptr_array_add (new_lines, g_strdup_printf ("kernel_image%s=%s", index_suffix, val));
|
||||||
|
|
||||||
val = ostree_bootconfig_parser_get (config, "initrd");
|
val = ostree_bootconfig_parser_get (config, "initrd");
|
||||||
if (val)
|
if (val)
|
||||||
g_ptr_array_add (new_lines, g_strdup_printf ("ramdisk_image=%s", val));
|
g_ptr_array_add (new_lines, g_strdup_printf ("ramdisk_image%s=%s", index_suffix, val));
|
||||||
|
|
||||||
val = ostree_bootconfig_parser_get (config, "options");
|
val = ostree_bootconfig_parser_get (config, "options");
|
||||||
if (val)
|
if (val)
|
||||||
{
|
{
|
||||||
glnx_fd_close int uenv_fd = -1;
|
g_ptr_array_add (new_lines, g_strdup_printf ("bootargs%s=%s", index_suffix, val));
|
||||||
__attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL;
|
if (i == 0)
|
||||||
const char *uenv_path = NULL;
|
if (!append_system_uenv (self, val, new_lines, cancellable, error))
|
||||||
const char *ostree_arg = NULL;
|
|
||||||
|
|
||||||
g_ptr_array_add (new_lines, g_strdup_printf ("bootargs=%s", val));
|
|
||||||
|
|
||||||
/* Append system's uEnv.txt, if it exists in $deployment/usr/lib/ostree-boot/ */
|
|
||||||
kargs = _ostree_kernel_args_from_string (val);
|
|
||||||
ostree_arg = _ostree_kernel_args_get_last_value (kargs, "ostree");
|
|
||||||
if (!ostree_arg)
|
|
||||||
{
|
|
||||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"No ostree= kernel argument found in boot loader configuration file");
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
ostree_arg += 1;
|
|
||||||
uenv_path = glnx_strjoina (ostree_arg, "/usr/lib/ostree-boot/uEnv.txt");
|
|
||||||
uenv_fd = openat (self->sysroot->sysroot_fd, uenv_path, O_CLOEXEC | O_RDONLY);
|
|
||||||
if (uenv_fd != -1)
|
|
||||||
{
|
|
||||||
char *uenv = glnx_fd_readall_utf8 (uenv_fd, NULL, cancellable, error);
|
|
||||||
if (!uenv)
|
|
||||||
{
|
|
||||||
g_prefix_error (error, "Reading %s: ", uenv_path);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
g_ptr_array_add (new_lines, uenv);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (errno != ENOENT)
|
|
||||||
{
|
|
||||||
g_prefix_error (error, "openat %s: ", uenv_path);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,13 @@ _ostree_raw_file_to_archive_stream (GInputStream *input,
|
||||||
gboolean ostree_validate_collection_id (const char *collection_id, GError **error);
|
gboolean ostree_validate_collection_id (const char *collection_id, GError **error);
|
||||||
#endif /* !OSTREE_ENABLE_EXPERIMENTAL_API */
|
#endif /* !OSTREE_ENABLE_EXPERIMENTAL_API */
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
_ostree_compare_timestamps (const char *current_rev,
|
||||||
|
guint64 current_ts,
|
||||||
|
const char *new_rev,
|
||||||
|
guint64 new_ts,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
#if (defined(OSTREE_COMPILATION) || GLIB_CHECK_VERSION(2, 44, 0)) && !defined(OSTREE_ENABLE_EXPERIMENTAL_API)
|
#if (defined(OSTREE_COMPILATION) || GLIB_CHECK_VERSION(2, 44, 0)) && !defined(OSTREE_ENABLE_EXPERIMENTAL_API)
|
||||||
#include <libglnx.h>
|
#include <libglnx.h>
|
||||||
#include "ostree-ref.h"
|
#include "ostree-ref.h"
|
||||||
|
|
|
||||||
|
|
@ -312,7 +312,7 @@ _ostree_file_header_new (GFileInfo *file_info,
|
||||||
* @file_info: a #GFileInfo
|
* @file_info: a #GFileInfo
|
||||||
* @xattrs: (allow-none): Optional extended attribute array
|
* @xattrs: (allow-none): Optional extended attribute array
|
||||||
*
|
*
|
||||||
* Returns: (transfer full): A new #GVariant containing file header for an archive-z2 repository
|
* Returns: (transfer full): A new #GVariant containing file header for an archive repository
|
||||||
*/
|
*/
|
||||||
GVariant *
|
GVariant *
|
||||||
_ostree_zlib_file_header_new (GFileInfo *file_info,
|
_ostree_zlib_file_header_new (GFileInfo *file_info,
|
||||||
|
|
@ -2086,6 +2086,38 @@ ostree_commit_get_timestamp (GVariant *commit_variant)
|
||||||
return GUINT64_FROM_BE (ret);
|
return GUINT64_FROM_BE (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Used in pull/deploy to validate we're not being downgraded */
|
||||||
|
gboolean
|
||||||
|
_ostree_compare_timestamps (const char *current_rev,
|
||||||
|
guint64 current_ts,
|
||||||
|
const char *new_rev,
|
||||||
|
guint64 new_ts,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
/* Newer timestamp is OK */
|
||||||
|
if (new_ts > current_ts)
|
||||||
|
return TRUE;
|
||||||
|
/* If they're equal, ensure they're the same rev */
|
||||||
|
if (new_ts == current_ts || strcmp (current_rev, new_rev) == 0)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* Looks like a downgrade, format an error message */
|
||||||
|
g_autoptr(GDateTime) current_dt = g_date_time_new_from_unix_utc (current_ts);
|
||||||
|
g_autoptr(GDateTime) new_dt = g_date_time_new_from_unix_utc (new_ts);
|
||||||
|
|
||||||
|
if (current_dt == NULL || new_dt == NULL)
|
||||||
|
return glnx_throw (error, "Upgrade target revision '%s' timestamp (%" G_GINT64_FORMAT ") or current revision '%s' timestamp (%" G_GINT64_FORMAT ") is invalid",
|
||||||
|
new_rev, new_ts,
|
||||||
|
current_rev, current_ts);
|
||||||
|
|
||||||
|
g_autofree char *current_ts_str = g_date_time_format (current_dt, "%c");
|
||||||
|
g_autofree char *new_ts_str = g_date_time_format (new_dt, "%c");
|
||||||
|
|
||||||
|
return glnx_throw (error, "Upgrade target revision '%s' with timestamp '%s' is chronologically older than current revision '%s' with timestamp '%s'",
|
||||||
|
new_rev, new_ts_str, current_rev, current_ts_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GVariant *
|
GVariant *
|
||||||
_ostree_detached_metadata_append_gpg_sig (GVariant *existing_metadata,
|
_ostree_detached_metadata_append_gpg_sig (GVariant *existing_metadata,
|
||||||
GBytes *signature_bytes)
|
GBytes *signature_bytes)
|
||||||
|
|
|
||||||
|
|
@ -187,14 +187,14 @@ _ostree_gpg_verifier_check_signature (OstreeGpgVerifier *self,
|
||||||
gpg_error = gpgme_data_new_from_fd (&kdata, fd);
|
gpg_error = gpgme_data_new_from_fd (&kdata, fd);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Loading data from fd %i", fd);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpg_error = gpgme_op_import (result->context, kdata);
|
gpg_error = gpgme_op_import (result->context, kdata);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Failed to import key");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -212,8 +212,7 @@ _ostree_gpg_verifier_check_signature (OstreeGpgVerifier *self,
|
||||||
0 /* do not copy */);
|
0 /* do not copy */);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to read signed data");
|
||||||
g_prefix_error (error, "Unable to read signed data: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -223,16 +222,14 @@ _ostree_gpg_verifier_check_signature (OstreeGpgVerifier *self,
|
||||||
0 /* do not copy */);
|
0 /* do not copy */);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to read signature");
|
||||||
g_prefix_error (error, "Unable to read signature: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
gpg_error = gpgme_op_verify (result->context, signature_buffer, data_buffer, NULL);
|
gpg_error = gpgme_op_verify (result->context, signature_buffer, data_buffer, NULL);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to complete signature verification");
|
||||||
g_prefix_error (error, "Unable to complete signature verification: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -368,31 +365,22 @@ _ostree_gpg_verifier_add_global_keyring_dir (OstreeGpgVerifier *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
const char *global_keyring_path = g_getenv ("OSTREE_GPG_HOME");
|
|
||||||
g_autoptr(GFile) global_keyring_dir = NULL;
|
|
||||||
gboolean ret = FALSE;
|
|
||||||
|
|
||||||
g_return_val_if_fail (OSTREE_IS_GPG_VERIFIER (self), FALSE);
|
g_return_val_if_fail (OSTREE_IS_GPG_VERIFIER (self), FALSE);
|
||||||
|
|
||||||
|
const char *global_keyring_path = g_getenv ("OSTREE_GPG_HOME");
|
||||||
if (global_keyring_path == NULL)
|
if (global_keyring_path == NULL)
|
||||||
global_keyring_path = DATADIR "/ostree/trusted.gpg.d/";
|
global_keyring_path = DATADIR "/ostree/trusted.gpg.d/";
|
||||||
|
|
||||||
if (g_file_test (global_keyring_path, G_FILE_TEST_IS_DIR))
|
if (g_file_test (global_keyring_path, G_FILE_TEST_IS_DIR))
|
||||||
{
|
{
|
||||||
global_keyring_dir = g_file_new_for_path (global_keyring_path);
|
g_autoptr(GFile) global_keyring_dir = g_file_new_for_path (global_keyring_path);
|
||||||
if (!_ostree_gpg_verifier_add_keyring_dir (self, global_keyring_dir,
|
if (!_ostree_gpg_verifier_add_keyring_dir (self, global_keyring_dir,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
{
|
return glnx_prefix_error (error, "Reading keyring directory '%s'",
|
||||||
g_prefix_error (error, "Reading keyring directory '%s'",
|
|
||||||
gs_file_get_path_cached (global_keyring_dir));
|
gs_file_get_path_cached (global_keyring_dir));
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OstreeGpgVerifier*
|
OstreeGpgVerifier*
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,8 @@ static OstreeGpgSignatureAttr all_signature_attrs[] = {
|
||||||
OSTREE_GPG_SIGNATURE_ATTR_PUBKEY_ALGO_NAME,
|
OSTREE_GPG_SIGNATURE_ATTR_PUBKEY_ALGO_NAME,
|
||||||
OSTREE_GPG_SIGNATURE_ATTR_HASH_ALGO_NAME,
|
OSTREE_GPG_SIGNATURE_ATTR_HASH_ALGO_NAME,
|
||||||
OSTREE_GPG_SIGNATURE_ATTR_USER_NAME,
|
OSTREE_GPG_SIGNATURE_ATTR_USER_NAME,
|
||||||
OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL
|
OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL,
|
||||||
|
OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT_PRIMARY
|
||||||
};
|
};
|
||||||
|
|
||||||
static void ostree_gpg_verify_result_initable_iface_init (GInitableIface *iface);
|
static void ostree_gpg_verify_result_initable_iface_init (GInitableIface *iface);
|
||||||
|
|
@ -133,8 +134,7 @@ ostree_gpg_verify_result_initable_init (GInitable *initable,
|
||||||
gpg_error = gpgme_new (&result->context);
|
gpg_error = gpgme_new (&result->context);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to create context");
|
||||||
g_prefix_error (error, "Unable to create context: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -328,9 +328,9 @@ ostree_gpg_verify_result_get (OstreeGpgVerifyResult *result,
|
||||||
* (OSTREE_GPG_SIGNATURE_ATTR_KEY_MISSING). */
|
* (OSTREE_GPG_SIGNATURE_ATTR_KEY_MISSING). */
|
||||||
for (ii = 0; ii < n_attrs; ii++)
|
for (ii = 0; ii < n_attrs; ii++)
|
||||||
{
|
{
|
||||||
if (attrs[ii] == OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT ||
|
if (attrs[ii] == OSTREE_GPG_SIGNATURE_ATTR_USER_NAME ||
|
||||||
attrs[ii] == OSTREE_GPG_SIGNATURE_ATTR_USER_NAME ||
|
attrs[ii] == OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL ||
|
||||||
attrs[ii] == OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL)
|
attrs[ii] == OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT_PRIMARY)
|
||||||
{
|
{
|
||||||
(void) gpgme_get_key (result->context, signature->fpr, &key, 0);
|
(void) gpgme_get_key (result->context, signature->fpr, &key, 0);
|
||||||
break;
|
break;
|
||||||
|
|
@ -373,11 +373,7 @@ ostree_gpg_verify_result_get (OstreeGpgVerifyResult *result,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT:
|
case OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT:
|
||||||
if (key != NULL && key->subkeys != NULL)
|
child = g_variant_new_string (signature->fpr);
|
||||||
v_string = key->subkeys->fpr;
|
|
||||||
else
|
|
||||||
v_string = signature->fpr;
|
|
||||||
child = g_variant_new_string (v_string);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSTREE_GPG_SIGNATURE_ATTR_TIMESTAMP:
|
case OSTREE_GPG_SIGNATURE_ATTR_TIMESTAMP:
|
||||||
|
|
@ -418,6 +414,14 @@ ostree_gpg_verify_result_get (OstreeGpgVerifyResult *result,
|
||||||
child = g_variant_new_string (v_string);
|
child = g_variant_new_string (v_string);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT_PRIMARY:
|
||||||
|
if (key != NULL && key->subkeys != NULL)
|
||||||
|
v_string = key->subkeys->fpr;
|
||||||
|
if (v_string == NULL)
|
||||||
|
v_string = "";
|
||||||
|
child = g_variant_new_string (v_string);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
g_critical ("Invalid signature attribute (%d)", attrs[ii]);
|
g_critical ("Invalid signature attribute (%d)", attrs[ii]);
|
||||||
g_variant_builder_clear (&builder);
|
g_variant_builder_clear (&builder);
|
||||||
|
|
@ -535,6 +539,7 @@ ostree_gpg_verify_result_describe_variant (GVariant *variant,
|
||||||
gint64 exp_timestamp;
|
gint64 exp_timestamp;
|
||||||
const char *type_string;
|
const char *type_string;
|
||||||
const char *fingerprint;
|
const char *fingerprint;
|
||||||
|
const char *fingerprint_primary;
|
||||||
const char *pubkey_algo;
|
const char *pubkey_algo;
|
||||||
const char *user_name;
|
const char *user_name;
|
||||||
const char *user_email;
|
const char *user_email;
|
||||||
|
|
@ -550,7 +555,7 @@ ostree_gpg_verify_result_describe_variant (GVariant *variant,
|
||||||
/* Verify the variant's type string. This code is
|
/* Verify the variant's type string. This code is
|
||||||
* not prepared to handle just any random GVariant. */
|
* not prepared to handle just any random GVariant. */
|
||||||
type_string = g_variant_get_type_string (variant);
|
type_string = g_variant_get_type_string (variant);
|
||||||
g_return_if_fail (strcmp (type_string, "(bbbbbsxxssss)") == 0);
|
g_return_if_fail (strcmp (type_string, "(bbbbbsxxsssss)") == 0);
|
||||||
|
|
||||||
/* The default format roughly mimics the verify output generated by
|
/* The default format roughly mimics the verify output generated by
|
||||||
* check_sig_and_print() in gnupg/g10/mainproc.c, though obviously
|
* check_sig_and_print() in gnupg/g10/mainproc.c, though obviously
|
||||||
|
|
@ -564,6 +569,8 @@ ostree_gpg_verify_result_describe_variant (GVariant *variant,
|
||||||
"b", &key_missing);
|
"b", &key_missing);
|
||||||
g_variant_get_child (variant, OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT,
|
g_variant_get_child (variant, OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT,
|
||||||
"&s", &fingerprint);
|
"&s", &fingerprint);
|
||||||
|
g_variant_get_child (variant, OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT_PRIMARY,
|
||||||
|
"&s", &fingerprint_primary);
|
||||||
g_variant_get_child (variant, OSTREE_GPG_SIGNATURE_ATTR_TIMESTAMP,
|
g_variant_get_child (variant, OSTREE_GPG_SIGNATURE_ATTR_TIMESTAMP,
|
||||||
"x", ×tamp);
|
"x", ×tamp);
|
||||||
g_variant_get_child (variant, OSTREE_GPG_SIGNATURE_ATTR_EXP_TIMESTAMP,
|
g_variant_get_child (variant, OSTREE_GPG_SIGNATURE_ATTR_EXP_TIMESTAMP,
|
||||||
|
|
@ -628,8 +635,26 @@ ostree_gpg_verify_result_describe_variant (GVariant *variant,
|
||||||
user_name, user_email);
|
user_name, user_email);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!key_missing && (g_strcmp0 (fingerprint, fingerprint_primary) != 0))
|
||||||
|
{
|
||||||
|
const char *key_id_primary;
|
||||||
|
|
||||||
|
len = strlen (fingerprint_primary);
|
||||||
|
key_id_primary = (len > 16) ? fingerprint_primary + len - 16 :
|
||||||
|
fingerprint_primary;
|
||||||
|
|
||||||
|
if (line_prefix != NULL)
|
||||||
|
g_string_append (output_buffer, line_prefix);
|
||||||
|
|
||||||
|
g_string_append_printf (output_buffer,
|
||||||
|
"Primary key ID %s\n", key_id_primary);
|
||||||
|
}
|
||||||
|
|
||||||
if (exp_timestamp > 0)
|
if (exp_timestamp > 0)
|
||||||
{
|
{
|
||||||
|
if (line_prefix != NULL)
|
||||||
|
g_string_append (output_buffer, line_prefix);
|
||||||
|
|
||||||
date_time_utc = g_date_time_new_from_unix_utc (exp_timestamp);
|
date_time_utc = g_date_time_new_from_unix_utc (exp_timestamp);
|
||||||
if (date_time_utc == NULL)
|
if (date_time_utc == NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -642,9 +667,6 @@ ostree_gpg_verify_result_describe_variant (GVariant *variant,
|
||||||
date_time_local = g_date_time_to_local (date_time_utc);
|
date_time_local = g_date_time_to_local (date_time_utc);
|
||||||
formatted_date_time = g_date_time_format (date_time_local, "%c");
|
formatted_date_time = g_date_time_format (date_time_local, "%c");
|
||||||
|
|
||||||
if (line_prefix != NULL)
|
|
||||||
g_string_append (output_buffer, line_prefix);
|
|
||||||
|
|
||||||
if (sig_expired)
|
if (sig_expired)
|
||||||
{
|
{
|
||||||
g_string_append_printf (output_buffer,
|
g_string_append_printf (output_buffer,
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,11 @@ typedef struct OstreeGpgVerifyResult OstreeGpgVerifyResult;
|
||||||
* @OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL:
|
* @OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL:
|
||||||
* [#G_VARIANT_TYPE_STRING] The email address of the signing key's primary
|
* [#G_VARIANT_TYPE_STRING] The email address of the signing key's primary
|
||||||
* user
|
* user
|
||||||
|
* @OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT_PRIMARY:
|
||||||
|
* [#G_VARIANT_TYPE_STRING] Fingerprint of the signing key's primary key
|
||||||
|
* (will be the same as OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT if the
|
||||||
|
* the signature is already from the primary key rather than a subkey,
|
||||||
|
* and will be the empty string if the key is missing.)
|
||||||
*
|
*
|
||||||
* Signature attributes available from an #OstreeGpgVerifyResult.
|
* Signature attributes available from an #OstreeGpgVerifyResult.
|
||||||
* The attribute's #GVariantType is shown in brackets.
|
* The attribute's #GVariantType is shown in brackets.
|
||||||
|
|
@ -80,7 +85,8 @@ typedef enum {
|
||||||
OSTREE_GPG_SIGNATURE_ATTR_PUBKEY_ALGO_NAME,
|
OSTREE_GPG_SIGNATURE_ATTR_PUBKEY_ALGO_NAME,
|
||||||
OSTREE_GPG_SIGNATURE_ATTR_HASH_ALGO_NAME,
|
OSTREE_GPG_SIGNATURE_ATTR_HASH_ALGO_NAME,
|
||||||
OSTREE_GPG_SIGNATURE_ATTR_USER_NAME,
|
OSTREE_GPG_SIGNATURE_ATTR_USER_NAME,
|
||||||
OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL
|
OSTREE_GPG_SIGNATURE_ATTR_USER_EMAIL,
|
||||||
|
OSTREE_GPG_SIGNATURE_ATTR_FINGERPRINT_PRIMARY,
|
||||||
} OstreeGpgSignatureAttr;
|
} OstreeGpgSignatureAttr;
|
||||||
|
|
||||||
_OSTREE_PUBLIC
|
_OSTREE_PUBLIC
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,28 @@ typedef struct archive OtAutoArchiveWrite;
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OtAutoArchiveWrite, archive_write_free)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OtAutoArchiveWrite, archive_write_free)
|
||||||
typedef struct archive OtAutoArchiveRead;
|
typedef struct archive OtAutoArchiveRead;
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OtAutoArchiveRead, archive_read_free)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OtAutoArchiveRead, archive_read_free)
|
||||||
|
|
||||||
|
static inline OtAutoArchiveRead *
|
||||||
|
ot_open_archive_read (const char *path, GError **error)
|
||||||
|
{
|
||||||
|
g_autoptr(OtAutoArchiveRead) a = archive_read_new ();
|
||||||
|
|
||||||
|
#ifdef HAVE_ARCHIVE_READ_SUPPORT_FILTER_ALL
|
||||||
|
archive_read_support_filter_all (a);
|
||||||
|
#else
|
||||||
|
archive_read_support_compression_all (a);
|
||||||
|
#endif
|
||||||
|
archive_read_support_format_all (a);
|
||||||
|
if (archive_read_open_filename (a, path, 8192) != ARCHIVE_OK)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"%s", archive_error_string (a));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_steal_pointer (&a);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
|
||||||
|
|
@ -188,8 +188,6 @@ create_file_copy_from_input_at (OstreeRepo *repo,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
const gboolean union_mode = options->overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES;
|
|
||||||
const gboolean add_mode = options->overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES;
|
|
||||||
const gboolean sepolicy_enabled = options->sepolicy && !repo->disable_xattrs;
|
const gboolean sepolicy_enabled = options->sepolicy && !repo->disable_xattrs;
|
||||||
g_autoptr(GVariant) modified_xattrs = NULL;
|
g_autoptr(GVariant) modified_xattrs = NULL;
|
||||||
|
|
||||||
|
|
@ -218,23 +216,51 @@ create_file_copy_from_input_at (OstreeRepo *repo,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (symlinkat (g_file_info_get_symlink_target (file_info),
|
const char *target = g_file_info_get_symlink_target (file_info);
|
||||||
destination_dfd, destination_name) < 0)
|
if (symlinkat (target, destination_dfd, destination_name) < 0)
|
||||||
{
|
{
|
||||||
|
if (errno != EEXIST)
|
||||||
|
return glnx_throw_errno_prefix (error, "symlinkat");
|
||||||
|
|
||||||
/* Handle union/add behaviors if we get EEXIST */
|
/* Handle union/add behaviors if we get EEXIST */
|
||||||
if (errno == EEXIST && union_mode)
|
switch (options->overwrite_mode)
|
||||||
|
{
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_NONE:
|
||||||
|
return glnx_throw_errno_prefix (error, "symlinkat");
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES:
|
||||||
{
|
{
|
||||||
/* Unioning? Let's unlink and try again */
|
/* Unioning? Let's unlink and try again */
|
||||||
(void) unlinkat (destination_dfd, destination_name, 0);
|
(void) unlinkat (destination_dfd, destination_name, 0);
|
||||||
if (symlinkat (g_file_info_get_symlink_target (file_info),
|
if (symlinkat (target, destination_dfd, destination_name) < 0)
|
||||||
destination_dfd, destination_name) < 0)
|
return glnx_throw_errno_prefix (error, "symlinkat");
|
||||||
return glnx_throw_errno (error);
|
|
||||||
}
|
}
|
||||||
else if (errno == EEXIST && add_mode)
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES:
|
||||||
/* Note early return - we don't want to set the xattrs below */
|
/* Note early return - we don't want to set the xattrs below */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL:
|
||||||
return glnx_throw_errno (error);
|
{
|
||||||
|
/* See the comments for the hardlink version of this
|
||||||
|
* for why we do this.
|
||||||
|
*/
|
||||||
|
struct stat dest_stbuf;
|
||||||
|
if (!glnx_fstatat (destination_dfd, destination_name, &dest_stbuf,
|
||||||
|
AT_SYMLINK_NOFOLLOW, error))
|
||||||
|
return FALSE;
|
||||||
|
if (S_ISLNK (dest_stbuf.st_mode))
|
||||||
|
{
|
||||||
|
g_autofree char *dest_target =
|
||||||
|
glnx_readlinkat_malloc (destination_dfd, destination_name,
|
||||||
|
cancellable, error);
|
||||||
|
if (!dest_target)
|
||||||
|
return FALSE;
|
||||||
|
/* In theory we could also compare xattrs...but eh */
|
||||||
|
if (g_str_equal (dest_target, target))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
errno = EEXIST;
|
||||||
|
return glnx_throw_errno_prefix (error, "symlinkat");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Process ownership and xattrs now that we made the link */
|
/* Process ownership and xattrs now that we made the link */
|
||||||
|
|
@ -255,7 +281,6 @@ create_file_copy_from_input_at (OstreeRepo *repo,
|
||||||
else if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR)
|
else if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_REGULAR)
|
||||||
{
|
{
|
||||||
g_auto(GLnxTmpfile) tmpf = { 0, };
|
g_auto(GLnxTmpfile) tmpf = { 0, };
|
||||||
GLnxLinkTmpfileReplaceMode replace_mode;
|
|
||||||
|
|
||||||
if (!glnx_open_tmpfile_linkable_at (destination_dfd, ".", O_WRONLY | O_CLOEXEC,
|
if (!glnx_open_tmpfile_linkable_at (destination_dfd, ".", O_WRONLY | O_CLOEXEC,
|
||||||
&tmpf, error))
|
&tmpf, error))
|
||||||
|
|
@ -278,12 +303,23 @@ create_file_copy_from_input_at (OstreeRepo *repo,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* The add/union/none behaviors map directly to GLnxLinkTmpfileReplaceMode */
|
/* The add/union/none behaviors map directly to GLnxLinkTmpfileReplaceMode */
|
||||||
if (add_mode)
|
GLnxLinkTmpfileReplaceMode replace_mode;
|
||||||
replace_mode = GLNX_LINK_TMPFILE_NOREPLACE_IGNORE_EXIST;
|
switch (options->overwrite_mode)
|
||||||
else if (union_mode)
|
{
|
||||||
replace_mode = GLNX_LINK_TMPFILE_REPLACE;
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_NONE:
|
||||||
else
|
|
||||||
replace_mode = GLNX_LINK_TMPFILE_NOREPLACE;
|
replace_mode = GLNX_LINK_TMPFILE_NOREPLACE;
|
||||||
|
break;
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES:
|
||||||
|
replace_mode = GLNX_LINK_TMPFILE_REPLACE;
|
||||||
|
break;
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES:
|
||||||
|
replace_mode = GLNX_LINK_TMPFILE_NOREPLACE_IGNORE_EXIST;
|
||||||
|
break;
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL:
|
||||||
|
/* We don't support copying in union identical */
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!glnx_link_tmpfile_at (&tmpf, replace_mode,
|
if (!glnx_link_tmpfile_at (&tmpf, replace_mode,
|
||||||
destination_dfd, destination_name,
|
destination_dfd, destination_name,
|
||||||
|
|
@ -329,14 +365,21 @@ checkout_file_hardlink (OstreeRepo *self,
|
||||||
else if (allow_noent && errno == ENOENT)
|
else if (allow_noent && errno == ENOENT)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
else if (errno == EEXIST && options->overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES)
|
else if (errno == EEXIST)
|
||||||
{
|
{
|
||||||
|
/* When we get EEXIST, we need to handle the different overwrite modes. */
|
||||||
|
switch (options->overwrite_mode)
|
||||||
|
{
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_NONE:
|
||||||
|
/* Just throw */
|
||||||
|
return glnx_throw_errno_prefix (error, "Hardlinking %s to %s", loose_path, destination_name);
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES:
|
||||||
/* In this mode, we keep existing content. Distinguish this case though to
|
/* In this mode, we keep existing content. Distinguish this case though to
|
||||||
* avoid inserting into the devino cache.
|
* avoid inserting into the devino cache.
|
||||||
*/
|
*/
|
||||||
ret_result = HARDLINK_RESULT_SKIP_EXISTED;
|
ret_result = HARDLINK_RESULT_SKIP_EXISTED;
|
||||||
}
|
break;
|
||||||
else if (errno == EEXIST && options->overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES)
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES:
|
||||||
{
|
{
|
||||||
/* Idiocy, from man rename(2)
|
/* Idiocy, from man rename(2)
|
||||||
*
|
*
|
||||||
|
|
@ -349,6 +392,35 @@ checkout_file_hardlink (OstreeRepo *self,
|
||||||
(void) unlinkat (destination_dfd, destination_name, 0);
|
(void) unlinkat (destination_dfd, destination_name, 0);
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL:
|
||||||
|
{
|
||||||
|
/* In this mode, we error out on EEXIST *unless* the files are already
|
||||||
|
* hardlinked, which is what rpm-ostree wants for package layering.
|
||||||
|
* https://github.com/projectatomic/rpm-ostree/issues/982
|
||||||
|
*
|
||||||
|
* This should be similar to the librpm version:
|
||||||
|
* https://github.com/rpm-software-management/rpm/blob/e3cd2bc85e0578f158d14e6f9624eb955c32543b/lib/rpmfi.c#L921
|
||||||
|
* in rpmfilesCompare().
|
||||||
|
*/
|
||||||
|
struct stat src_stbuf;
|
||||||
|
if (!glnx_fstatat (srcfd, loose_path, &src_stbuf,
|
||||||
|
AT_SYMLINK_NOFOLLOW, error))
|
||||||
|
return FALSE;
|
||||||
|
struct stat dest_stbuf;
|
||||||
|
if (!glnx_fstatat (destination_dfd, destination_name, &dest_stbuf,
|
||||||
|
AT_SYMLINK_NOFOLLOW, error))
|
||||||
|
return FALSE;
|
||||||
|
const gboolean is_identical =
|
||||||
|
(src_stbuf.st_dev == dest_stbuf.st_dev &&
|
||||||
|
src_stbuf.st_ino == dest_stbuf.st_ino);
|
||||||
|
if (is_identical)
|
||||||
|
ret_result = HARDLINK_RESULT_SKIP_EXISTED;
|
||||||
|
else
|
||||||
|
return glnx_throw_errno_prefix (error, "Hardlinking %s to %s", loose_path, destination_name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return glnx_throw_errno_prefix (error, "Hardlinking %s to %s", loose_path, destination_name);
|
return glnx_throw_errno_prefix (error, "Hardlinking %s to %s", loose_path, destination_name);
|
||||||
|
|
@ -652,12 +724,20 @@ checkout_tree_at_recurse (OstreeRepo *self,
|
||||||
*/
|
*/
|
||||||
if (TEMP_FAILURE_RETRY (mkdirat (destination_parent_fd, destination_name, 0700)) < 0)
|
if (TEMP_FAILURE_RETRY (mkdirat (destination_parent_fd, destination_name, 0700)) < 0)
|
||||||
{
|
{
|
||||||
if (errno == EEXIST &&
|
if (errno != EEXIST)
|
||||||
(options->overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES
|
return glnx_throw_errno_prefix (error, "mkdirat");
|
||||||
|| options->overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES))
|
|
||||||
|
switch (options->overwrite_mode)
|
||||||
|
{
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_NONE:
|
||||||
|
return glnx_throw_errno_prefix (error, "mkdirat");
|
||||||
|
/* All of these cases are the same for directories */
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES:
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES:
|
||||||
|
case OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL:
|
||||||
did_exist = TRUE;
|
did_exist = TRUE;
|
||||||
else
|
break;
|
||||||
return glnx_throw_errno (error);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1001,6 +1081,9 @@ ostree_repo_checkout_at (OstreeRepo *self,
|
||||||
|
|
||||||
g_return_val_if_fail (!(options->force_copy && options->no_copy_fallback), FALSE);
|
g_return_val_if_fail (!(options->force_copy && options->no_copy_fallback), FALSE);
|
||||||
g_return_val_if_fail (!options->sepolicy || options->force_copy, FALSE);
|
g_return_val_if_fail (!options->sepolicy || options->force_copy, FALSE);
|
||||||
|
/* union identical requires hardlink mode */
|
||||||
|
g_return_val_if_fail (!(options->overwrite_mode == OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL &&
|
||||||
|
!options->no_copy_fallback), FALSE);
|
||||||
|
|
||||||
g_autoptr(GFile) commit_root = (GFile*) _ostree_repo_file_new_for_commit (self, commit, error);
|
g_autoptr(GFile) commit_root = (GFile*) _ostree_repo_file_new_for_commit (self, commit, error);
|
||||||
if (!commit_root)
|
if (!commit_root)
|
||||||
|
|
@ -1120,14 +1203,11 @@ ostree_repo_checkout_gc (OstreeRepo *self,
|
||||||
|
|
||||||
if (stbuf.st_nlink == 1)
|
if (stbuf.st_nlink == 1)
|
||||||
{
|
{
|
||||||
if (unlinkat (dfd_iter.fd, dent->d_name, 0) != 0)
|
if (!glnx_unlinkat (dfd_iter.fd, dent->d_name, 0, error))
|
||||||
{
|
|
||||||
glnx_set_error_from_errno (error);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
#include "ostree-core-private.h"
|
#include "ostree-core-private.h"
|
||||||
#include "ostree-repo-private.h"
|
#include "ostree-repo-private.h"
|
||||||
|
#include "ostree-sepolicy-private.h"
|
||||||
#include "ostree-repo-file-enumerator.h"
|
#include "ostree-repo-file-enumerator.h"
|
||||||
#include "ostree-checksum-input-stream.h"
|
#include "ostree-checksum-input-stream.h"
|
||||||
#include "ostree-varint.h"
|
#include "ostree-varint.h"
|
||||||
|
|
@ -1028,35 +1029,33 @@ devino_cache_lookup (OstreeRepo *self,
|
||||||
* @cancellable: Cancellable
|
* @cancellable: Cancellable
|
||||||
* @error: Error
|
* @error: Error
|
||||||
*
|
*
|
||||||
* When ostree builds a mutable tree from directory like in
|
* This function is deprecated in favor of using ostree_repo_devino_cache_new(),
|
||||||
* ostree_repo_write_directory_to_mtree(), it has to scan all files that you
|
* which allows a precise mapping to be built up between hardlink checkout files
|
||||||
* pass in and compute their checksums. If your commit contains hardlinks from
|
* and their checksums between `ostree_repo_checkout_at()` and
|
||||||
* ostree's existing repo, ostree can build a mapping of device numbers and
|
* `ostree_repo_write_directory_to_mtree()`.
|
||||||
* inodes to their checksum.
|
*
|
||||||
|
* When invoking ostree_repo_write_directory_to_mtree(), it has to compute the
|
||||||
|
* checksum of all files. If your commit contains hardlinks from a checkout,
|
||||||
|
* this functions builds a mapping of device numbers and inodes to their
|
||||||
|
* checksum.
|
||||||
*
|
*
|
||||||
* There is an upfront cost to creating this mapping, as this will scan the
|
* There is an upfront cost to creating this mapping, as this will scan the
|
||||||
* entire objects directory. If your commit is composed of mostly hardlinks to
|
* entire objects directory. If your commit is composed of mostly hardlinks to
|
||||||
* existing ostree objects, then this will speed up considerably, so call it
|
* existing ostree objects, then this will speed up considerably, so call it
|
||||||
* before you call ostree_write_directory_to_mtree() or similar.
|
* before you call ostree_write_directory_to_mtree() or similar. However,
|
||||||
|
* ostree_repo_devino_cache_new() is better as it avoids scanning all objects.
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
ostree_repo_scan_hardlinks (OstreeRepo *self,
|
ostree_repo_scan_hardlinks (OstreeRepo *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
|
|
||||||
g_return_val_if_fail (self->in_transaction == TRUE, FALSE);
|
g_return_val_if_fail (self->in_transaction == TRUE, FALSE);
|
||||||
|
|
||||||
if (!self->loose_object_devino_hash)
|
if (!self->loose_object_devino_hash)
|
||||||
self->loose_object_devino_hash = (GHashTable*)ostree_repo_devino_cache_new ();
|
self->loose_object_devino_hash = (GHashTable*)ostree_repo_devino_cache_new ();
|
||||||
g_hash_table_remove_all (self->loose_object_devino_hash);
|
g_hash_table_remove_all (self->loose_object_devino_hash);
|
||||||
if (!scan_loose_devino (self, self->loose_object_devino_hash, cancellable, error))
|
return scan_loose_devino (self, self->loose_object_devino_hash, cancellable, error);
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1132,6 +1131,7 @@ rename_pending_loose_objects (OstreeRepo *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
GLNX_AUTO_PREFIX_ERROR ("rename pending", error);
|
||||||
g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
|
g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
|
||||||
|
|
||||||
if (!glnx_dirfd_iterator_init_at (self->commit_stagedir_fd, ".", FALSE, &dfd_iter, error))
|
if (!glnx_dirfd_iterator_init_at (self->commit_stagedir_fd, ".", FALSE, &dfd_iter, error))
|
||||||
|
|
@ -1224,11 +1224,10 @@ cleanup_tmpdir (OstreeRepo *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
GLNX_AUTO_PREFIX_ERROR ("tmpdir cleanup", error);
|
||||||
|
const guint64 curtime_secs = g_get_real_time () / 1000000;
|
||||||
|
|
||||||
g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
|
g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
|
||||||
guint64 curtime_secs;
|
|
||||||
|
|
||||||
curtime_secs = g_get_real_time () / 1000000;
|
|
||||||
|
|
||||||
if (!glnx_dirfd_iterator_init_at (self->tmp_dir_fd, ".", TRUE, &dfd_iter, error))
|
if (!glnx_dirfd_iterator_init_at (self->tmp_dir_fd, ".", TRUE, &dfd_iter, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
@ -1256,7 +1255,7 @@ cleanup_tmpdir (OstreeRepo *self,
|
||||||
{
|
{
|
||||||
if (errno == ENOENT) /* Did another cleanup win? */
|
if (errno == ENOENT) /* Did another cleanup win? */
|
||||||
continue;
|
continue;
|
||||||
return glnx_throw_errno (error);
|
return glnx_throw_errno_prefix (error, "fstatat(%s)", dent->d_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* First, if it's a directory which needs locking, but it's
|
/* First, if it's a directory which needs locking, but it's
|
||||||
|
|
@ -1283,7 +1282,7 @@ cleanup_tmpdir (OstreeRepo *self,
|
||||||
* from *other* boots
|
* from *other* boots
|
||||||
*/
|
*/
|
||||||
if (!glnx_shutil_rm_rf_at (dfd_iter.fd, dent->d_name, cancellable, error))
|
if (!glnx_shutil_rm_rf_at (dfd_iter.fd, dent->d_name, cancellable, error))
|
||||||
return FALSE;
|
return glnx_prefix_error (error, "Removing %s", dent->d_name);
|
||||||
}
|
}
|
||||||
/* FIXME - move OSTREE_REPO_TMPDIR_FETCHER underneath the
|
/* FIXME - move OSTREE_REPO_TMPDIR_FETCHER underneath the
|
||||||
* staging/boot-id scheme as well, since all of the "did it get
|
* staging/boot-id scheme as well, since all of the "did it get
|
||||||
|
|
@ -1308,7 +1307,7 @@ cleanup_tmpdir (OstreeRepo *self,
|
||||||
if (delta > self->tmp_expiry_seconds)
|
if (delta > self->tmp_expiry_seconds)
|
||||||
{
|
{
|
||||||
if (!glnx_shutil_rm_rf_at (dfd_iter.fd, dent->d_name, cancellable, error))
|
if (!glnx_shutil_rm_rf_at (dfd_iter.fd, dent->d_name, cancellable, error))
|
||||||
return FALSE;
|
return glnx_prefix_error (error, "Removing %s", dent->d_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1535,7 +1534,7 @@ ostree_repo_commit_transaction (OstreeRepo *self,
|
||||||
if (g_getenv ("OSTREE_SUPPRESS_SYNCFS") == NULL)
|
if (g_getenv ("OSTREE_SUPPRESS_SYNCFS") == NULL)
|
||||||
{
|
{
|
||||||
if (syncfs (self->tmp_dir_fd) < 0)
|
if (syncfs (self->tmp_dir_fd) < 0)
|
||||||
return glnx_throw_errno (error);
|
return glnx_throw_errno_prefix (error, "syncfs");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rename_pending_loose_objects (self, cancellable, error))
|
if (!rename_pending_loose_objects (self, cancellable, error))
|
||||||
|
|
@ -2335,6 +2334,10 @@ create_tree_variant_from_hashes (GHashTable *file_checksums,
|
||||||
return serialized_tree;
|
return serialized_tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If any filtering is set up, perform it, and return modified file info in
|
||||||
|
* @out_modified_info. Note that if no filtering is applied, @out_modified_info
|
||||||
|
* will simply be another reference (with incremented refcount) to @file_info.
|
||||||
|
*/
|
||||||
OstreeRepoCommitFilterResult
|
OstreeRepoCommitFilterResult
|
||||||
_ostree_repo_commit_modifier_apply (OstreeRepo *self,
|
_ostree_repo_commit_modifier_apply (OstreeRepo *self,
|
||||||
OstreeRepoCommitModifier *modifier,
|
OstreeRepoCommitModifier *modifier,
|
||||||
|
|
@ -2410,24 +2413,6 @@ ptrarray_path_join (GPtrArray *path)
|
||||||
return g_string_free (path_buf, FALSE);
|
return g_string_free (path_buf, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
apply_commit_filter (OstreeRepo *self,
|
|
||||||
OstreeRepoCommitModifier *modifier,
|
|
||||||
const char *relpath,
|
|
||||||
GFileInfo *file_info,
|
|
||||||
GFileInfo **out_modified_info)
|
|
||||||
{
|
|
||||||
if (modifier == NULL ||
|
|
||||||
(modifier->filter == NULL &&
|
|
||||||
(modifier->flags & OSTREE_REPO_COMMIT_MODIFIER_FLAGS_CANONICAL_PERMISSIONS) == 0))
|
|
||||||
{
|
|
||||||
*out_modified_info = g_object_ref (file_info);
|
|
||||||
return OSTREE_REPO_COMMIT_FILTER_ALLOW;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _ostree_repo_commit_modifier_apply (self, modifier, relpath, file_info, out_modified_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
get_modified_xattrs (OstreeRepo *self,
|
get_modified_xattrs (OstreeRepo *self,
|
||||||
OstreeRepoCommitModifier *modifier,
|
OstreeRepoCommitModifier *modifier,
|
||||||
|
|
@ -2498,6 +2483,16 @@ get_modified_xattrs (OstreeRepo *self,
|
||||||
{
|
{
|
||||||
g_autoptr(GVariantBuilder) builder = NULL;
|
g_autoptr(GVariantBuilder) builder = NULL;
|
||||||
|
|
||||||
|
if (ret_xattrs)
|
||||||
|
{
|
||||||
|
/* drop out any existing SELinux policy from the set, so we don't end up
|
||||||
|
* counting it twice in the checksum */
|
||||||
|
g_autoptr(GVariant) new_ret_xattrs = NULL;
|
||||||
|
new_ret_xattrs = _ostree_filter_selinux_xattr (ret_xattrs);
|
||||||
|
g_variant_unref (ret_xattrs);
|
||||||
|
ret_xattrs = g_steal_pointer (&new_ret_xattrs);
|
||||||
|
}
|
||||||
|
|
||||||
/* ret_xattrs may be NULL */
|
/* ret_xattrs may be NULL */
|
||||||
builder = ot_util_variant_builder_from_variant (ret_xattrs,
|
builder = ot_util_variant_builder_from_variant (ret_xattrs,
|
||||||
G_VARIANT_TYPE ("a(ayay)"));
|
G_VARIANT_TYPE ("a(ayay)"));
|
||||||
|
|
@ -2564,7 +2559,7 @@ write_directory_content_to_mtree_internal (OstreeRepo *self,
|
||||||
if (modifier != NULL)
|
if (modifier != NULL)
|
||||||
child_relpath = ptrarray_path_join (path);
|
child_relpath = ptrarray_path_join (path);
|
||||||
|
|
||||||
filter_result = apply_commit_filter (self, modifier, child_relpath, child_info, &modified_info);
|
filter_result = _ostree_repo_commit_modifier_apply (self, modifier, child_relpath, child_info, &modified_info);
|
||||||
|
|
||||||
if (filter_result != OSTREE_REPO_COMMIT_FILTER_ALLOW)
|
if (filter_result != OSTREE_REPO_COMMIT_FILTER_ALLOW)
|
||||||
{
|
{
|
||||||
|
|
@ -2733,7 +2728,7 @@ write_directory_to_mtree_internal (OstreeRepo *self,
|
||||||
relpath = ptrarray_path_join (path);
|
relpath = ptrarray_path_join (path);
|
||||||
|
|
||||||
g_autoptr(GFileInfo) modified_info = NULL;
|
g_autoptr(GFileInfo) modified_info = NULL;
|
||||||
filter_result = apply_commit_filter (self, modifier, relpath, child_info, &modified_info);
|
filter_result = _ostree_repo_commit_modifier_apply (self, modifier, relpath, child_info, &modified_info);
|
||||||
|
|
||||||
if (filter_result == OSTREE_REPO_COMMIT_FILTER_ALLOW)
|
if (filter_result == OSTREE_REPO_COMMIT_FILTER_ALLOW)
|
||||||
{
|
{
|
||||||
|
|
@ -2803,8 +2798,8 @@ write_dfd_iter_to_mtree_internal (OstreeRepo *self,
|
||||||
OstreeRepoCommitFilterResult filter_result;
|
OstreeRepoCommitFilterResult filter_result;
|
||||||
struct stat dir_stbuf;
|
struct stat dir_stbuf;
|
||||||
|
|
||||||
if (fstat (src_dfd_iter->fd, &dir_stbuf) != 0)
|
if (!glnx_fstat (src_dfd_iter->fd, &dir_stbuf, error))
|
||||||
return glnx_throw_errno (error);
|
return FALSE;
|
||||||
|
|
||||||
child_info = _ostree_stbuf_to_gfileinfo (&dir_stbuf);
|
child_info = _ostree_stbuf_to_gfileinfo (&dir_stbuf);
|
||||||
|
|
||||||
|
|
@ -2812,7 +2807,7 @@ write_dfd_iter_to_mtree_internal (OstreeRepo *self,
|
||||||
{
|
{
|
||||||
relpath = ptrarray_path_join (path);
|
relpath = ptrarray_path_join (path);
|
||||||
|
|
||||||
filter_result = apply_commit_filter (self, modifier, relpath, child_info, &modified_info);
|
filter_result = _ostree_repo_commit_modifier_apply (self, modifier, relpath, child_info, &modified_info);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -314,7 +314,9 @@ ostree_repo_finder_mount_resolve_async (OstreeRepoFinder *finde
|
||||||
|
|
||||||
g_autoptr(GHashTable) repo_refs = NULL; /* (element-type OstreeCollectionRef utf8) */
|
g_autoptr(GHashTable) repo_refs = NULL; /* (element-type OstreeCollectionRef utf8) */
|
||||||
|
|
||||||
if (!ostree_repo_list_collection_refs (repo, refs[i]->collection_id, &repo_refs, cancellable, &local_error))
|
if (!ostree_repo_list_collection_refs (repo, refs[i]->collection_id, &repo_refs,
|
||||||
|
OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES,
|
||||||
|
cancellable, &local_error))
|
||||||
{
|
{
|
||||||
g_debug ("Ignoring ref (%s, %s) on mount ‘%s’ as its refs could not be listed: %s",
|
g_debug ("Ignoring ref (%s, %s) on mount ‘%s’ as its refs could not be listed: %s",
|
||||||
refs[i]->collection_id, refs[i]->ref_name, mount_name, local_error->message);
|
refs[i]->collection_id, refs[i]->ref_name, mount_name, local_error->message);
|
||||||
|
|
|
||||||
|
|
@ -123,24 +123,30 @@ squash_trailing_slashes (char *path)
|
||||||
*endp = '\0';
|
*endp = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Like archive_entry_stat(), but since some archives only store the permission
|
||||||
|
* mode bits in hardlink entries, so let's just make it into a regular file.
|
||||||
|
* Yes, this hack will work even if it's a hardlink to a symlink.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
read_archive_entry_stat (struct archive_entry *entry,
|
||||||
|
struct stat *stbuf)
|
||||||
|
{
|
||||||
|
const struct stat *st = archive_entry_stat (entry);
|
||||||
|
|
||||||
|
*stbuf = *st;
|
||||||
|
if (archive_entry_hardlink (entry))
|
||||||
|
stbuf->st_mode |= S_IFREG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a GFileInfo from archive_entry_stat() */
|
||||||
static GFileInfo *
|
static GFileInfo *
|
||||||
file_info_from_archive_entry (struct archive_entry *entry)
|
file_info_from_archive_entry (struct archive_entry *entry)
|
||||||
{
|
{
|
||||||
const struct stat *st = archive_entry_stat (entry);
|
struct stat stbuf;
|
||||||
struct stat st_copy;
|
read_archive_entry_stat (entry, &stbuf);
|
||||||
|
|
||||||
/* Some archives only store the permission mode bits in hardlink entries, so
|
g_autoptr(GFileInfo) info = _ostree_stbuf_to_gfileinfo (&stbuf);
|
||||||
* let's just make it into a regular file. Yes, this hack will work even if
|
if (S_ISLNK (stbuf.st_mode))
|
||||||
* it's a hardlink to a symlink. */
|
|
||||||
if (archive_entry_hardlink (entry))
|
|
||||||
{
|
|
||||||
st_copy = *st;
|
|
||||||
st_copy.st_mode |= S_IFREG;
|
|
||||||
st = &st_copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_autoptr(GFileInfo) info = _ostree_stbuf_to_gfileinfo (st);
|
|
||||||
if (S_ISLNK (st->st_mode))
|
|
||||||
g_file_info_set_attribute_byte_string (info, "standard::symlink-target",
|
g_file_info_set_attribute_byte_string (info, "standard::symlink-target",
|
||||||
archive_entry_symlink (entry));
|
archive_entry_symlink (entry));
|
||||||
|
|
||||||
|
|
@ -247,7 +253,18 @@ aic_get_final_path (OstreeRepoArchiveImportContext *ctx,
|
||||||
const char *path,
|
const char *path,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
if (ctx->opts->use_ostree_convention)
|
if (ctx->opts->translate_pathname)
|
||||||
|
{
|
||||||
|
struct stat stbuf;
|
||||||
|
path = path_relative (path, error);
|
||||||
|
read_archive_entry_stat (ctx->entry, &stbuf);
|
||||||
|
char *ret = ctx->opts->translate_pathname (ctx->repo, &stbuf, path,
|
||||||
|
ctx->opts->translate_pathname_user_data);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
/* Fall through */
|
||||||
|
}
|
||||||
|
else if (ctx->opts->use_ostree_convention)
|
||||||
return path_relative_ostree (path, error);
|
return path_relative_ostree (path, error);
|
||||||
return g_strdup (path_relative (path, error));
|
return g_strdup (path_relative (path, error));
|
||||||
}
|
}
|
||||||
|
|
@ -258,7 +275,6 @@ aic_get_final_entry_pathname (OstreeRepoArchiveImportContext *ctx,
|
||||||
{
|
{
|
||||||
const char *pathname = archive_entry_pathname (ctx->entry);
|
const char *pathname = archive_entry_pathname (ctx->entry);
|
||||||
g_autofree char *final = aic_get_final_path (ctx, pathname, error);
|
g_autofree char *final = aic_get_final_path (ctx, pathname, error);
|
||||||
|
|
||||||
if (final == NULL)
|
if (final == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
@ -642,17 +658,17 @@ aic_import_entry (OstreeRepoArchiveImportContext *ctx,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
g_autoptr(GFileInfo) fi = NULL;
|
|
||||||
g_autoptr(OstreeMutableTree) parent = NULL;
|
|
||||||
g_autofree char *path = aic_get_final_entry_pathname (ctx, error);
|
g_autofree char *path = aic_get_final_entry_pathname (ctx, error);
|
||||||
|
|
||||||
if (path == NULL)
|
if (path == NULL)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
g_autoptr(GFileInfo) fi = NULL;
|
||||||
if (aic_apply_modifier_filter (ctx, path, &fi)
|
if (aic_apply_modifier_filter (ctx, path, &fi)
|
||||||
== OSTREE_REPO_COMMIT_FILTER_SKIP)
|
== OSTREE_REPO_COMMIT_FILTER_SKIP)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
g_autoptr(OstreeMutableTree) parent = NULL;
|
||||||
if (!aic_get_parent_dir (ctx, path, &parent, cancellable, error))
|
if (!aic_get_parent_dir (ctx, path, &parent, cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
@ -861,7 +877,11 @@ ostree_repo_import_archive_to_mtree (OstreeRepo *self,
|
||||||
g_file_info_set_attribute_uint32 (fi, "unix::gid", 0);
|
g_file_info_set_attribute_uint32 (fi, "unix::gid", 0);
|
||||||
g_file_info_set_attribute_uint32 (fi, "unix::mode", DEFAULT_DIRMODE);
|
g_file_info_set_attribute_uint32 (fi, "unix::mode", DEFAULT_DIRMODE);
|
||||||
|
|
||||||
if (!aic_ensure_parent_dir_with_file_info (&aictx, mtree, "/", fi, NULL,
|
g_autoptr(GFileInfo) mfi = NULL;
|
||||||
|
(void)_ostree_repo_commit_modifier_apply (self, modifier, "/",
|
||||||
|
fi, &mfi);
|
||||||
|
|
||||||
|
if (!aic_ensure_parent_dir_with_file_info (&aictx, mtree, "/", mfi, NULL,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
@ -903,18 +923,9 @@ ostree_repo_write_archive_to_mtree (OstreeRepo *self,
|
||||||
g_autoptr(OtAutoArchiveRead) a = archive_read_new ();
|
g_autoptr(OtAutoArchiveRead) a = archive_read_new ();
|
||||||
OstreeRepoImportArchiveOptions opts = { 0, };
|
OstreeRepoImportArchiveOptions opts = { 0, };
|
||||||
|
|
||||||
#ifdef HAVE_ARCHIVE_READ_SUPPORT_FILTER_ALL
|
a = ot_open_archive_read (gs_file_get_path_cached (archive), error);
|
||||||
archive_read_support_filter_all (a);
|
if (!a)
|
||||||
#else
|
|
||||||
archive_read_support_compression_all (a);
|
|
||||||
#endif
|
|
||||||
archive_read_support_format_all (a);
|
|
||||||
if (archive_read_open_filename (a, gs_file_get_path_cached (archive), 8192) != ARCHIVE_OK)
|
|
||||||
{
|
|
||||||
propagate_libarchive_error (error, a);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
opts.autocreate_parents = !!autocreate_parents;
|
opts.autocreate_parents = !!autocreate_parents;
|
||||||
|
|
||||||
if (!ostree_repo_import_archive_to_mtree (self, &opts, a, mtree, modifier, cancellable, error))
|
if (!ostree_repo_import_archive_to_mtree (self, &opts, a, mtree, modifier, cancellable, error))
|
||||||
|
|
|
||||||
|
|
@ -154,10 +154,32 @@ struct OstreeRepo {
|
||||||
gboolean generate_sizes;
|
gboolean generate_sizes;
|
||||||
guint64 tmp_expiry_seconds;
|
guint64 tmp_expiry_seconds;
|
||||||
gchar *collection_id;
|
gchar *collection_id;
|
||||||
|
gboolean add_remotes_config_dir; /* Add new remotes in remotes.d dir */
|
||||||
|
|
||||||
OstreeRepo *parent_repo;
|
OstreeRepo *parent_repo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Taken from flatpak; may be made into public API later */
|
||||||
|
typedef OstreeRepo _OstreeRepoAutoTransaction;
|
||||||
|
static inline void
|
||||||
|
_ostree_repo_auto_transaction_cleanup (void *p)
|
||||||
|
{
|
||||||
|
OstreeRepo *repo = p;
|
||||||
|
if (repo)
|
||||||
|
(void) ostree_repo_abort_transaction (repo, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline _OstreeRepoAutoTransaction *
|
||||||
|
_ostree_repo_auto_transaction_start (OstreeRepo *repo,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
if (!ostree_repo_prepare_transaction (repo, NULL, cancellable, error))
|
||||||
|
return NULL;
|
||||||
|
return (_OstreeRepoAutoTransaction *)repo;
|
||||||
|
}
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (_OstreeRepoAutoTransaction, _ostree_repo_auto_transaction_cleanup)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
dev_t dev;
|
dev_t dev;
|
||||||
ino_t ino;
|
ino_t ino;
|
||||||
|
|
@ -399,6 +421,7 @@ gboolean ostree_repo_set_collection_id (OstreeRepo *self,
|
||||||
gboolean ostree_repo_list_collection_refs (OstreeRepo *self,
|
gboolean ostree_repo_list_collection_refs (OstreeRepo *self,
|
||||||
const char *match_collection_id,
|
const char *match_collection_id,
|
||||||
GHashTable **out_all_refs,
|
GHashTable **out_all_refs,
|
||||||
|
OstreeRepoListRefsExtFlags flags,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,13 +43,7 @@ prune_commitpartial_file (OstreeRepo *repo,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
g_autofree char *path = _ostree_get_commitpartial_path (checksum);
|
g_autofree char *path = _ostree_get_commitpartial_path (checksum);
|
||||||
if (unlinkat (repo->repo_dir_fd, path, 0) != 0)
|
return ot_ensure_unlinked_at (repo->repo_dir_fd, path, error);
|
||||||
{
|
|
||||||
if (errno != ENOENT)
|
|
||||||
return glnx_throw_errno_prefix (error, "unlinkat");
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
@ -147,8 +141,8 @@ _ostree_repo_prune_tmp (OstreeRepo *self,
|
||||||
if (has_sig_suffix)
|
if (has_sig_suffix)
|
||||||
dent->d_name[len - 4] = '.';
|
dent->d_name[len - 4] = '.';
|
||||||
|
|
||||||
if (unlinkat (dfd_iter.fd, dent->d_name, 0) < 0)
|
if (!glnx_unlinkat (dfd_iter.fd, dent->d_name, 0, error))
|
||||||
return glnx_throw_errno_prefix (error, "unlinkat");
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -335,7 +329,7 @@ ostree_repo_prune (OstreeRepo *self,
|
||||||
g_autoptr(GHashTable) all_collection_refs = NULL; /* (element-type OstreeChecksumRef utf8) */
|
g_autoptr(GHashTable) all_collection_refs = NULL; /* (element-type OstreeChecksumRef utf8) */
|
||||||
|
|
||||||
if (!ostree_repo_list_collection_refs (self, NULL, &all_collection_refs,
|
if (!ostree_repo_list_collection_refs (self, NULL, &all_collection_refs,
|
||||||
cancellable, error))
|
OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES, cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
GLNX_HASH_TABLE_FOREACH_V (all_collection_refs, const char*, checksum)
|
GLNX_HASH_TABLE_FOREACH_V (all_collection_refs, const char*, checksum)
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,7 @@ typedef struct {
|
||||||
GBytes *summary_data_sig;
|
GBytes *summary_data_sig;
|
||||||
GVariant *summary;
|
GVariant *summary;
|
||||||
GHashTable *summary_deltas_checksums;
|
GHashTable *summary_deltas_checksums;
|
||||||
|
GHashTable *ref_original_commits; /* Maps checksum to commit, used by timestamp checks */
|
||||||
GPtrArray *static_delta_superblocks;
|
GPtrArray *static_delta_superblocks;
|
||||||
GHashTable *expected_commit_sizes; /* Maps commit checksum to known size */
|
GHashTable *expected_commit_sizes; /* Maps commit checksum to known size */
|
||||||
GHashTable *commit_to_depth; /* Maps commit checksum maximum depth */
|
GHashTable *commit_to_depth; /* Maps commit checksum maximum depth */
|
||||||
|
|
@ -136,6 +137,7 @@ typedef struct {
|
||||||
guint n_fetched_localcache_metadata;
|
guint n_fetched_localcache_metadata;
|
||||||
guint n_fetched_localcache_content;
|
guint n_fetched_localcache_content;
|
||||||
|
|
||||||
|
gboolean timestamp_check; /* Verify commit timestamps */
|
||||||
int maxdepth;
|
int maxdepth;
|
||||||
guint64 start_time;
|
guint64 start_time;
|
||||||
|
|
||||||
|
|
@ -1355,11 +1357,8 @@ static_deltapart_fetch_on_complete (GObject *object,
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* From here on, if we fail to apply the delta, we'll re-fetch it */
|
/* From here on, if we fail to apply the delta, we'll re-fetch it */
|
||||||
if (unlinkat (_ostree_fetcher_get_dfd (fetcher), temp_path, 0) < 0)
|
if (!glnx_unlinkat (_ostree_fetcher_get_dfd (fetcher), temp_path, 0, error))
|
||||||
{
|
|
||||||
glnx_set_error_from_errno (error);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
in = g_unix_input_stream_new (fd, FALSE);
|
in = g_unix_input_stream_new (fd, FALSE);
|
||||||
|
|
||||||
|
|
@ -1589,6 +1588,9 @@ verify_bindings (OtPullData *pull_data,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Look at a commit object, and determine whether there are
|
||||||
|
* more things to fetch.
|
||||||
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
scan_commit_object (OtPullData *pull_data,
|
scan_commit_object (OtPullData *pull_data,
|
||||||
const char *checksum,
|
const char *checksum,
|
||||||
|
|
@ -1597,19 +1599,8 @@ scan_commit_object (OtPullData *pull_data,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
/* If we found a legacy transaction flag, assume we have to scan.
|
|
||||||
* We always do a scan of dirtree objects; see
|
|
||||||
* https://github.com/ostreedev/ostree/issues/543
|
|
||||||
*/
|
|
||||||
OstreeRepoCommitState commitstate;
|
|
||||||
g_autoptr(GVariant) commit = NULL;
|
|
||||||
g_autoptr(GVariant) parent_csum = NULL;
|
|
||||||
const guchar *parent_csum_bytes = NULL;
|
|
||||||
gpointer depthp;
|
gpointer depthp;
|
||||||
gint depth;
|
gint depth;
|
||||||
gboolean is_partial;
|
|
||||||
|
|
||||||
if (g_hash_table_lookup_extended (pull_data->commit_to_depth, checksum,
|
if (g_hash_table_lookup_extended (pull_data->commit_to_depth, checksum,
|
||||||
NULL, &depthp))
|
NULL, &depthp))
|
||||||
{
|
{
|
||||||
|
|
@ -1632,31 +1623,60 @@ scan_commit_object (OtPullData *pull_data,
|
||||||
cancellable,
|
cancellable,
|
||||||
error);
|
error);
|
||||||
if (!process_verify_result (pull_data, checksum, result, error))
|
if (!process_verify_result (pull_data, checksum, result, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we found a legacy transaction flag, assume we have to scan.
|
||||||
|
* We always do a scan of dirtree objects; see
|
||||||
|
* https://github.com/ostreedev/ostree/issues/543
|
||||||
|
*/
|
||||||
|
OstreeRepoCommitState commitstate;
|
||||||
|
g_autoptr(GVariant) commit = NULL;
|
||||||
if (!ostree_repo_load_commit (pull_data->repo, checksum, &commit, &commitstate, error))
|
if (!ostree_repo_load_commit (pull_data->repo, checksum, &commit, &commitstate, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
/* If ref is non-NULL then the commit we fetched was requested through the
|
/* If ref is non-NULL then the commit we fetched was requested through the
|
||||||
* branch, otherwise we requested a commit checksum without specifying a branch.
|
* branch, otherwise we requested a commit checksum without specifying a branch.
|
||||||
*/
|
*/
|
||||||
if (!verify_bindings (pull_data, commit, ref, error))
|
if (!verify_bindings (pull_data, commit, ref, error))
|
||||||
|
return glnx_prefix_error (error, "Commit %s", checksum);
|
||||||
|
|
||||||
|
if (pull_data->timestamp_check)
|
||||||
{
|
{
|
||||||
g_prefix_error (error, "Commit %s: ", checksum);
|
/* We don't support timestamp checking while recursing right now */
|
||||||
goto out;
|
g_assert (ref);
|
||||||
|
g_assert_cmpint (recursion_depth, ==, 0);
|
||||||
|
const char *orig_rev = NULL;
|
||||||
|
if (!g_hash_table_lookup_extended (pull_data->ref_original_commits,
|
||||||
|
ref, NULL, (void**)&orig_rev))
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
g_autoptr(GVariant) orig_commit = NULL;
|
||||||
|
if (orig_rev)
|
||||||
|
{
|
||||||
|
if (!ostree_repo_load_commit (pull_data->repo, orig_rev,
|
||||||
|
&orig_commit, NULL, error))
|
||||||
|
return glnx_prefix_error (error, "Reading %s for timestamp-check", ref->ref_name);
|
||||||
|
|
||||||
|
guint64 orig_ts = ostree_commit_get_timestamp (orig_commit);
|
||||||
|
guint64 new_ts = ostree_commit_get_timestamp (commit);
|
||||||
|
if (!_ostree_compare_timestamps (orig_rev, orig_ts, checksum, new_ts, error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we found a legacy transaction flag, assume all commits are partial */
|
/* If we found a legacy transaction flag, assume all commits are partial */
|
||||||
is_partial = commitstate_is_partial (pull_data, commitstate);
|
gboolean is_partial = commitstate_is_partial (pull_data, commitstate);
|
||||||
|
|
||||||
/* PARSE OSTREE_SERIALIZED_COMMIT_VARIANT */
|
/* PARSE OSTREE_SERIALIZED_COMMIT_VARIANT */
|
||||||
|
g_autoptr(GVariant) parent_csum = NULL;
|
||||||
|
const guchar *parent_csum_bytes = NULL;
|
||||||
g_variant_get_child (commit, 1, "@ay", &parent_csum);
|
g_variant_get_child (commit, 1, "@ay", &parent_csum);
|
||||||
if (g_variant_n_children (parent_csum) > 0)
|
if (g_variant_n_children (parent_csum) > 0)
|
||||||
{
|
{
|
||||||
parent_csum_bytes = ostree_checksum_bytes_peek_validate (parent_csum, error);
|
parent_csum_bytes = ostree_checksum_bytes_peek_validate (parent_csum, error);
|
||||||
if (parent_csum_bytes == NULL)
|
if (parent_csum_bytes == NULL)
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parent_csum_bytes != NULL && pull_data->maxdepth == -1)
|
if (parent_csum_bytes != NULL && pull_data->maxdepth == -1)
|
||||||
|
|
@ -1711,11 +1731,11 @@ scan_commit_object (OtPullData *pull_data,
|
||||||
|
|
||||||
tree_contents_csum_bytes = ostree_checksum_bytes_peek_validate (tree_contents_csum, error);
|
tree_contents_csum_bytes = ostree_checksum_bytes_peek_validate (tree_contents_csum, error);
|
||||||
if (tree_contents_csum_bytes == NULL)
|
if (tree_contents_csum_bytes == NULL)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
tree_meta_csum_bytes = ostree_checksum_bytes_peek_validate (tree_meta_csum, error);
|
tree_meta_csum_bytes = ostree_checksum_bytes_peek_validate (tree_meta_csum, error);
|
||||||
if (tree_meta_csum_bytes == NULL)
|
if (tree_meta_csum_bytes == NULL)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
queue_scan_one_metadata_object_c (pull_data, tree_contents_csum_bytes,
|
queue_scan_one_metadata_object_c (pull_data, tree_contents_csum_bytes,
|
||||||
OSTREE_OBJECT_TYPE_DIR_TREE, "/", recursion_depth + 1, NULL);
|
OSTREE_OBJECT_TYPE_DIR_TREE, "/", recursion_depth + 1, NULL);
|
||||||
|
|
@ -1724,9 +1744,7 @@ scan_commit_object (OtPullData *pull_data,
|
||||||
OSTREE_OBJECT_TYPE_DIR_META, NULL, recursion_depth + 1, NULL);
|
OSTREE_OBJECT_TYPE_DIR_META, NULL, recursion_depth + 1, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
@ -2506,22 +2524,11 @@ static gboolean
|
||||||
validate_variant_is_csum (GVariant *csum,
|
validate_variant_is_csum (GVariant *csum,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
|
|
||||||
if (!g_variant_is_of_type (csum, G_VARIANT_TYPE ("ay")))
|
if (!g_variant_is_of_type (csum, G_VARIANT_TYPE ("ay")))
|
||||||
{
|
return glnx_throw (error, "Invalid checksum variant of type '%s', expected 'ay'",
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Invalid checksum variant of type '%s', expected 'ay'",
|
|
||||||
g_variant_get_type_string (csum));
|
g_variant_get_type_string (csum));
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ostree_validate_structureof_csum_v (csum, error))
|
return ostree_validate_structureof_csum_v (csum, error);
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load the summary from the cache if the provided .sig file is the same as the
|
/* Load the summary from the cache if the provided .sig file is the same as the
|
||||||
|
|
@ -2534,27 +2541,19 @@ _ostree_repo_load_cache_summary_if_same_sig (OstreeRepo *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote, ".sig");
|
|
||||||
|
|
||||||
glnx_fd_close int prev_fd = -1;
|
|
||||||
g_autoptr(GBytes) old_sig_contents = NULL;
|
|
||||||
|
|
||||||
if (self->cache_dir_fd == -1)
|
if (self->cache_dir_fd == -1)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote, ".sig");
|
||||||
|
glnx_fd_close int prev_fd = -1;
|
||||||
if (!ot_openat_ignore_enoent (self->cache_dir_fd, summary_cache_sig_file, &prev_fd, error))
|
if (!ot_openat_ignore_enoent (self->cache_dir_fd, summary_cache_sig_file, &prev_fd, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (prev_fd < 0)
|
if (prev_fd < 0)
|
||||||
{
|
return TRUE; /* Note early return */
|
||||||
ret = TRUE;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
old_sig_contents = glnx_fd_readall_bytes (prev_fd, cancellable, error);
|
g_autoptr(GBytes) old_sig_contents = glnx_fd_readall_bytes (prev_fd, cancellable, error);
|
||||||
if (!old_sig_contents)
|
if (!old_sig_contents)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (g_bytes_compare (old_sig_contents, summary_sig) == 0)
|
if (g_bytes_compare (old_sig_contents, summary_sig) == 0)
|
||||||
{
|
{
|
||||||
|
|
@ -2569,25 +2568,21 @@ _ostree_repo_load_cache_summary_if_same_sig (OstreeRepo *self,
|
||||||
if (errno == ENOENT)
|
if (errno == ENOENT)
|
||||||
{
|
{
|
||||||
(void) unlinkat (self->cache_dir_fd, summary_cache_sig_file, 0);
|
(void) unlinkat (self->cache_dir_fd, summary_cache_sig_file, 0);
|
||||||
ret = TRUE;
|
return TRUE; /* Note early return */
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glnx_set_error_from_errno (error);
|
return glnx_throw_errno_prefix (error, "openat(%s)", summary_cache_file);
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
summary_data = glnx_fd_readall_bytes (summary_fd, cancellable, error);
|
summary_data = glnx_fd_readall_bytes (summary_fd, cancellable, error);
|
||||||
if (!summary_data)
|
if (!summary_data)
|
||||||
goto out;
|
return FALSE;
|
||||||
*summary = summary_data;
|
*summary = summary_data;
|
||||||
}
|
}
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Replace the current summary+signature with new versions */
|
||||||
static gboolean
|
static gboolean
|
||||||
_ostree_repo_cache_summary (OstreeRepo *self,
|
_ostree_repo_cache_summary (OstreeRepo *self,
|
||||||
const char *remote,
|
const char *remote,
|
||||||
|
|
@ -2596,36 +2591,31 @@ _ostree_repo_cache_summary (OstreeRepo *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
const char *summary_cache_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote);
|
|
||||||
const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote, ".sig");
|
|
||||||
|
|
||||||
if (self->cache_dir_fd == -1)
|
if (self->cache_dir_fd == -1)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (!glnx_shutil_mkdir_p_at (self->cache_dir_fd, _OSTREE_SUMMARY_CACHE_DIR, 0775, cancellable, error))
|
if (!glnx_shutil_mkdir_p_at (self->cache_dir_fd, _OSTREE_SUMMARY_CACHE_DIR, 0775, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
|
const char *summary_cache_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote);
|
||||||
if (!glnx_file_replace_contents_at (self->cache_dir_fd,
|
if (!glnx_file_replace_contents_at (self->cache_dir_fd,
|
||||||
summary_cache_file,
|
summary_cache_file,
|
||||||
g_bytes_get_data (summary, NULL),
|
g_bytes_get_data (summary, NULL),
|
||||||
g_bytes_get_size (summary),
|
g_bytes_get_size (summary),
|
||||||
self->disable_fsync ? GLNX_FILE_REPLACE_NODATASYNC : GLNX_FILE_REPLACE_DATASYNC_NEW,
|
self->disable_fsync ? GLNX_FILE_REPLACE_NODATASYNC : GLNX_FILE_REPLACE_DATASYNC_NEW,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
|
const char *summary_cache_sig_file = glnx_strjoina (_OSTREE_SUMMARY_CACHE_DIR, "/", remote, ".sig");
|
||||||
if (!glnx_file_replace_contents_at (self->cache_dir_fd,
|
if (!glnx_file_replace_contents_at (self->cache_dir_fd,
|
||||||
summary_cache_sig_file,
|
summary_cache_sig_file,
|
||||||
g_bytes_get_data (summary_sig, NULL),
|
g_bytes_get_data (summary_sig, NULL),
|
||||||
g_bytes_get_size (summary_sig),
|
g_bytes_get_size (summary_sig),
|
||||||
self->disable_fsync ? GLNX_FILE_REPLACE_NODATASYNC : GLNX_FILE_REPLACE_DATASYNC_NEW,
|
self->disable_fsync ? GLNX_FILE_REPLACE_NODATASYNC : GLNX_FILE_REPLACE_DATASYNC_NEW,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static OstreeFetcher *
|
static OstreeFetcher *
|
||||||
|
|
@ -2717,6 +2707,7 @@ _ostree_repo_remote_new_fetcher (OstreeRepo *self,
|
||||||
_ostree_fetcher_set_proxy (fetcher, http_proxy);
|
_ostree_fetcher_set_proxy (fetcher, http_proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!_ostree_repo_remote_name_is_file (remote_name))
|
||||||
{
|
{
|
||||||
g_autofree char *cookie_file = g_strdup_printf ("%s.cookies.txt", remote_name);
|
g_autofree char *cookie_file = g_strdup_printf ("%s.cookies.txt", remote_name);
|
||||||
/* TODO; port away from this; a bit hard since both libsoup and libcurl
|
/* TODO; port away from this; a bit hard since both libsoup and libcurl
|
||||||
|
|
@ -3199,6 +3190,7 @@ initiate_request (OtPullData *pull_data,
|
||||||
* * disable-static-deltas (b): Do not use static deltas
|
* * disable-static-deltas (b): Do not use static deltas
|
||||||
* * require-static-deltas (b): Require static deltas
|
* * require-static-deltas (b): Require static deltas
|
||||||
* * override-commit-ids (as): Array of specific commit IDs to fetch for refs
|
* * override-commit-ids (as): Array of specific commit IDs to fetch for refs
|
||||||
|
* * timestamp-check (b): Verify commit timestamps are newer than current (when pulling via ref); Since: 2017.11
|
||||||
* * dry-run (b): Only print information on what will be downloaded (requires static deltas)
|
* * dry-run (b): Only print information on what will be downloaded (requires static deltas)
|
||||||
* * override-url (s): Fetch objects from this URL if remote specifies no metalink in options
|
* * override-url (s): Fetch objects from this URL if remote specifies no metalink in options
|
||||||
* * inherit-transaction (b): Don't initiate, finish or abort a transaction, useful to do multiple pulls in one transaction.
|
* * inherit-transaction (b): Don't initiate, finish or abort a transaction, useful to do multiple pulls in one transaction.
|
||||||
|
|
@ -3275,10 +3267,12 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
(void) g_variant_lookup (options, "http-headers", "@a(ss)", &pull_data->extra_headers);
|
(void) g_variant_lookup (options, "http-headers", "@a(ss)", &pull_data->extra_headers);
|
||||||
(void) g_variant_lookup (options, "update-frequency", "u", &update_frequency);
|
(void) g_variant_lookup (options, "update-frequency", "u", &update_frequency);
|
||||||
(void) g_variant_lookup (options, "localcache-repos", "^a&s", &opt_localcache_repos);
|
(void) g_variant_lookup (options, "localcache-repos", "^a&s", &opt_localcache_repos);
|
||||||
|
(void) g_variant_lookup (options, "timestamp-check", "b", &pull_data->timestamp_check);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_return_val_if_fail (OSTREE_IS_REPO (self), FALSE);
|
g_return_val_if_fail (OSTREE_IS_REPO (self), FALSE);
|
||||||
g_return_val_if_fail (pull_data->maxdepth >= -1, FALSE);
|
g_return_val_if_fail (pull_data->maxdepth >= -1, FALSE);
|
||||||
|
g_return_val_if_fail (!pull_data->timestamp_check || pull_data->maxdepth == 0, FALSE);
|
||||||
g_return_val_if_fail (!opt_collection_refs_set ||
|
g_return_val_if_fail (!opt_collection_refs_set ||
|
||||||
(refs_to_fetch == NULL && override_commit_ids == NULL), FALSE);
|
(refs_to_fetch == NULL && override_commit_ids == NULL), FALSE);
|
||||||
if (refs_to_fetch && override_commit_ids)
|
if (refs_to_fetch && override_commit_ids)
|
||||||
|
|
@ -3322,6 +3316,9 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
pull_data->summary_deltas_checksums = g_hash_table_new_full (g_str_hash, g_str_equal,
|
pull_data->summary_deltas_checksums = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
(GDestroyNotify)g_free,
|
(GDestroyNotify)g_free,
|
||||||
(GDestroyNotify)g_free);
|
(GDestroyNotify)g_free);
|
||||||
|
pull_data->ref_original_commits = g_hash_table_new_full (ostree_collection_ref_hash, ostree_collection_ref_equal,
|
||||||
|
(GDestroyNotify)NULL,
|
||||||
|
(GDestroyNotify)g_variant_unref);
|
||||||
pull_data->scanned_metadata = g_hash_table_new_full (ostree_hash_object_name, g_variant_equal,
|
pull_data->scanned_metadata = g_hash_table_new_full (ostree_hash_object_name, g_variant_equal,
|
||||||
(GDestroyNotify)g_variant_unref, NULL);
|
(GDestroyNotify)g_variant_unref, NULL);
|
||||||
pull_data->fetched_detached_metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
|
pull_data->fetched_detached_metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||||
|
|
@ -3596,7 +3593,7 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We can't use static deltas if pulling into an archive-z2 repo. */
|
/* We can't use static deltas if pulling into an archive repo. */
|
||||||
if (self->mode == OSTREE_REPO_MODE_ARCHIVE_Z2)
|
if (self->mode == OSTREE_REPO_MODE_ARCHIVE_Z2)
|
||||||
{
|
{
|
||||||
if (pull_data->require_static_deltas)
|
if (pull_data->require_static_deltas)
|
||||||
|
|
@ -3923,6 +3920,24 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
ref_with_collection = ostree_collection_ref_dup (ref);
|
ref_with_collection = ostree_collection_ref_dup (ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we have timestamp checking enabled, find the current value of
|
||||||
|
* the ref, and store its timestamp in the hash map, to check later.
|
||||||
|
*/
|
||||||
|
if (pull_data->timestamp_check)
|
||||||
|
{
|
||||||
|
g_autofree char *from_rev = NULL;
|
||||||
|
if (!ostree_repo_resolve_rev (pull_data->repo, ref_with_collection->ref_name, TRUE,
|
||||||
|
&from_rev, error))
|
||||||
|
goto out;
|
||||||
|
/* Explicitly store NULL if there's no previous revision. We do
|
||||||
|
* this so we can assert() if we somehow didn't find a ref in the
|
||||||
|
* hash at all. Note we don't copy the collection-ref, so the
|
||||||
|
* lifetime of this hash must be equal to `requested_refs_to_fetch`.
|
||||||
|
*/
|
||||||
|
g_hash_table_insert (pull_data->ref_original_commits, ref_with_collection,
|
||||||
|
g_steal_pointer (&from_rev));
|
||||||
|
}
|
||||||
|
|
||||||
g_hash_table_replace (updated_requested_refs_to_fetch,
|
g_hash_table_replace (updated_requested_refs_to_fetch,
|
||||||
g_steal_pointer (&ref_with_collection),
|
g_steal_pointer (&ref_with_collection),
|
||||||
g_steal_pointer (&contents));
|
g_steal_pointer (&contents));
|
||||||
|
|
@ -4223,6 +4238,7 @@ ostree_repo_pull_with_options (OstreeRepo *self,
|
||||||
g_clear_pointer (&pull_data->scanned_metadata, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&pull_data->scanned_metadata, (GDestroyNotify) g_hash_table_unref);
|
||||||
g_clear_pointer (&pull_data->fetched_detached_metadata, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&pull_data->fetched_detached_metadata, (GDestroyNotify) g_hash_table_unref);
|
||||||
g_clear_pointer (&pull_data->summary_deltas_checksums, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&pull_data->summary_deltas_checksums, (GDestroyNotify) g_hash_table_unref);
|
||||||
|
g_clear_pointer (&pull_data->ref_original_commits, (GDestroyNotify) g_hash_table_unref);
|
||||||
g_clear_pointer (&pull_data->requested_content, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&pull_data->requested_content, (GDestroyNotify) g_hash_table_unref);
|
||||||
g_clear_pointer (&pull_data->requested_fallback_content, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&pull_data->requested_fallback_content, (GDestroyNotify) g_hash_table_unref);
|
||||||
g_clear_pointer (&pull_data->requested_metadata, (GDestroyNotify) g_hash_table_unref);
|
g_clear_pointer (&pull_data->requested_metadata, (GDestroyNotify) g_hash_table_unref);
|
||||||
|
|
|
||||||
|
|
@ -560,7 +560,7 @@ _ostree_repo_list_refs_internal (OstreeRepo *self,
|
||||||
if (!ostree_parse_refspec (refspec_prefix, &remote, &ref_prefix, error))
|
if (!ostree_parse_refspec (refspec_prefix, &remote, &ref_prefix, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (remote)
|
if (!(flags & OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES) && remote)
|
||||||
{
|
{
|
||||||
prefix_path = glnx_strjoina ("refs/remotes/", remote, "/");
|
prefix_path = glnx_strjoina ("refs/remotes/", remote, "/");
|
||||||
path = glnx_strjoina (prefix_path, ref_prefix);
|
path = glnx_strjoina (prefix_path, ref_prefix);
|
||||||
|
|
@ -620,6 +620,8 @@ _ostree_repo_list_refs_internal (OstreeRepo *self,
|
||||||
ret_all_refs, cancellable, error))
|
ret_all_refs, cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (!(flags & OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES))
|
||||||
|
{
|
||||||
g_string_truncate (base_path, 0);
|
g_string_truncate (base_path, 0);
|
||||||
|
|
||||||
if (!glnx_dirfd_iterator_init_at (self->repo_dir_fd, "refs/remotes", TRUE, &dfd_iter, error))
|
if (!glnx_dirfd_iterator_init_at (self->repo_dir_fd, "refs/remotes", TRUE, &dfd_iter, error))
|
||||||
|
|
@ -648,6 +650,7 @@ _ostree_repo_list_refs_internal (OstreeRepo *self,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ot_transfer_out_value (out_all_refs, &ret_all_refs);
|
ot_transfer_out_value (out_all_refs, &ret_all_refs);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
@ -1004,11 +1007,8 @@ _ostree_repo_write_ref (OstreeRepo *self,
|
||||||
{
|
{
|
||||||
if (dfd >= 0)
|
if (dfd >= 0)
|
||||||
{
|
{
|
||||||
if (unlinkat (dfd, ref->ref_name, 0) != 0)
|
if (!ot_ensure_unlinked_at (dfd, ref->ref_name, error))
|
||||||
{
|
return FALSE;
|
||||||
if (errno != ENOENT)
|
|
||||||
return glnx_throw_errno (error);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (rev != NULL)
|
else if (rev != NULL)
|
||||||
|
|
@ -1101,18 +1101,23 @@ _ostree_repo_update_collection_refs (OstreeRepo *self,
|
||||||
* @self: Repo
|
* @self: Repo
|
||||||
* @match_collection_id: (nullable): If non-%NULL, only list refs from this collection
|
* @match_collection_id: (nullable): If non-%NULL, only list refs from this collection
|
||||||
* @out_all_refs: (out) (element-type OstreeCollectionRef utf8): Mapping from collection–ref to checksum
|
* @out_all_refs: (out) (element-type OstreeCollectionRef utf8): Mapping from collection–ref to checksum
|
||||||
|
* @flags: Options controlling listing behavior
|
||||||
* @cancellable: Cancellable
|
* @cancellable: Cancellable
|
||||||
* @error: Error
|
* @error: Error
|
||||||
*
|
*
|
||||||
* List all local and mirrored refs, mapping them to the commit checksums they
|
* List all local, mirrored, and remote refs, mapping them to the commit
|
||||||
* currently point to in @out_all_refs. If @match_collection_id is specified,
|
* checksums they currently point to in @out_all_refs. If @match_collection_id
|
||||||
* the results will be limited to those with an equal collection ID.
|
* is specified, the results will be limited to those with an equal collection
|
||||||
|
* ID.
|
||||||
*
|
*
|
||||||
* #OstreeCollectionRefs are guaranteed to be returned with their collection ID
|
* #OstreeCollectionRefs are guaranteed to be returned with their collection ID
|
||||||
* set to a non-%NULL value; so no refs from `refs/heads` will be listed if no
|
* set to a non-%NULL value; so no refs from `refs/heads` will be listed if no
|
||||||
* collection ID is configured for the repository
|
* collection ID is configured for the repository
|
||||||
* (ostree_repo_get_collection_id()).
|
* (ostree_repo_get_collection_id()).
|
||||||
*
|
*
|
||||||
|
* If you want to exclude refs from `refs/remotes`, use
|
||||||
|
* %OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES in @flags.
|
||||||
|
*
|
||||||
* Returns: %TRUE on success, %FALSE otherwise
|
* Returns: %TRUE on success, %FALSE otherwise
|
||||||
* Since: 2017.8
|
* Since: 2017.8
|
||||||
*/
|
*/
|
||||||
|
|
@ -1120,6 +1125,7 @@ gboolean
|
||||||
ostree_repo_list_collection_refs (OstreeRepo *self,
|
ostree_repo_list_collection_refs (OstreeRepo *self,
|
||||||
const char *match_collection_id,
|
const char *match_collection_id,
|
||||||
GHashTable **out_all_refs,
|
GHashTable **out_all_refs,
|
||||||
|
OstreeRepoListRefsExtFlags flags,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
|
@ -1130,6 +1136,10 @@ ostree_repo_list_collection_refs (OstreeRepo *self,
|
||||||
if (match_collection_id != NULL && !ostree_validate_collection_id (match_collection_id, error))
|
if (match_collection_id != NULL && !ostree_validate_collection_id (match_collection_id, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
const gchar *refs_dirs[] = { "refs/mirrors", "refs/remotes", NULL };
|
||||||
|
if (flags & OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES)
|
||||||
|
refs_dirs[1] = NULL;
|
||||||
|
|
||||||
g_autoptr(GHashTable) ret_all_refs = NULL;
|
g_autoptr(GHashTable) ret_all_refs = NULL;
|
||||||
|
|
||||||
ret_all_refs = g_hash_table_new_full (ostree_collection_ref_hash,
|
ret_all_refs = g_hash_table_new_full (ostree_collection_ref_hash,
|
||||||
|
|
@ -1150,7 +1160,7 @@ ostree_repo_list_collection_refs (OstreeRepo *self,
|
||||||
if (!glnx_opendirat (self->repo_dir_fd, "refs/heads", TRUE, &refs_heads_dfd, error))
|
if (!glnx_opendirat (self->repo_dir_fd, "refs/heads", TRUE, &refs_heads_dfd, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!enumerate_refs_recurse (self, NULL, OSTREE_REPO_LIST_REFS_EXT_NONE,
|
if (!enumerate_refs_recurse (self, NULL, flags,
|
||||||
main_collection_id, refs_heads_dfd, base_path,
|
main_collection_id, refs_heads_dfd, base_path,
|
||||||
refs_heads_dfd, ".",
|
refs_heads_dfd, ".",
|
||||||
ret_all_refs, cancellable, error))
|
ret_all_refs, cancellable, error))
|
||||||
|
|
@ -1159,15 +1169,20 @@ ostree_repo_list_collection_refs (OstreeRepo *self,
|
||||||
|
|
||||||
g_string_truncate (base_path, 0);
|
g_string_truncate (base_path, 0);
|
||||||
|
|
||||||
gboolean refs_mirrors_exists = FALSE;
|
for (const char **iter = refs_dirs; iter && *iter; iter++)
|
||||||
if (!ot_dfd_iter_init_allow_noent (self->repo_dir_fd, "refs/mirrors",
|
{
|
||||||
&dfd_iter, &refs_mirrors_exists, error))
|
const char *refs_dir = *iter;
|
||||||
|
gboolean refs_dir_exists = FALSE;
|
||||||
|
if (!ot_dfd_iter_init_allow_noent (self->repo_dir_fd, refs_dir,
|
||||||
|
&dfd_iter, &refs_dir_exists, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
while (refs_mirrors_exists)
|
while (refs_dir_exists)
|
||||||
{
|
{
|
||||||
struct dirent *dent;
|
struct dirent *dent;
|
||||||
glnx_fd_close int collection_dfd = -1;
|
glnx_fd_close int subdir_fd = -1;
|
||||||
|
const gchar *current_collection_id;
|
||||||
|
g_autofree gchar *remote_collection_id = NULL;
|
||||||
|
|
||||||
if (!glnx_dirfd_iterator_next_dent_ensure_dtype (&dfd_iter, &dent, cancellable, error))
|
if (!glnx_dirfd_iterator_next_dent_ensure_dtype (&dfd_iter, &dent, cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
@ -1177,19 +1192,43 @@ ostree_repo_list_collection_refs (OstreeRepo *self,
|
||||||
if (dent->d_type != DT_DIR)
|
if (dent->d_type != DT_DIR)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (g_strcmp0 (refs_dir, "refs/mirrors") == 0)
|
||||||
|
{
|
||||||
if (match_collection_id != NULL && g_strcmp0 (match_collection_id, dent->d_name) != 0)
|
if (match_collection_id != NULL && g_strcmp0 (match_collection_id, dent->d_name) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
else
|
||||||
|
current_collection_id = dent->d_name;
|
||||||
|
}
|
||||||
|
else /* refs_dir = "refs/remotes" */
|
||||||
|
{
|
||||||
|
g_autoptr(GError) local_error = NULL;
|
||||||
|
if (!ostree_repo_get_remote_option (self, dent->d_name, "collection-id",
|
||||||
|
NULL, &remote_collection_id, &local_error) ||
|
||||||
|
!ostree_validate_collection_id (remote_collection_id, &local_error))
|
||||||
|
{
|
||||||
|
g_debug ("Ignoring remote ‘%s’ due to no valid collection ID being configured for it: %s",
|
||||||
|
dent->d_name, local_error->message);
|
||||||
|
g_clear_error (&local_error);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!glnx_opendirat (dfd_iter.fd, dent->d_name, TRUE, &collection_dfd, error))
|
if (match_collection_id != NULL && g_strcmp0 (match_collection_id, remote_collection_id) != 0)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
current_collection_id = remote_collection_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!glnx_opendirat (dfd_iter.fd, dent->d_name, TRUE, &subdir_fd, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!enumerate_refs_recurse (self, NULL, OSTREE_REPO_LIST_REFS_EXT_NONE,
|
if (!enumerate_refs_recurse (self, NULL, flags,
|
||||||
dent->d_name, collection_dfd, base_path,
|
current_collection_id, subdir_fd, base_path,
|
||||||
collection_dfd, ".",
|
subdir_fd, ".",
|
||||||
ret_all_refs,
|
ret_all_refs,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ot_transfer_out_value (out_all_refs, &ret_all_refs);
|
ot_transfer_out_value (out_all_refs, &ret_all_refs);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
||||||
|
|
@ -608,7 +608,7 @@ dispatch_open_splice_and_close (OstreeRepo *repo,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Slower path, for symlinks and unpacking deltas into archive-z2 */
|
/* Slower path, for symlinks and unpacking deltas into archive */
|
||||||
g_autoptr(GFileInfo) finfo =
|
g_autoptr(GFileInfo) finfo =
|
||||||
_ostree_mode_uidgid_to_gfileinfo (state->mode, state->uid, state->gid);
|
_ostree_mode_uidgid_to_gfileinfo (state->mode, state->uid, state->gid);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,9 +47,36 @@
|
||||||
#include <sys/file.h>
|
#include <sys/file.h>
|
||||||
#include <sys/statvfs.h>
|
#include <sys/statvfs.h>
|
||||||
|
|
||||||
|
/* ABI Size checks for ostree-repo.h, only for LP64 systems;
|
||||||
|
* https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
|
||||||
|
*/
|
||||||
|
#if __SIZEOF_POINTER__ == 8 && __SIZEOF_LONG__ == 8 && __SIZEOF_INT__ == 4
|
||||||
|
G_STATIC_ASSERT(sizeof(OstreeRepoTransactionStats) == sizeof(int) * 4 + 8 * 5);
|
||||||
|
G_STATIC_ASSERT(sizeof(OstreeRepoImportArchiveOptions) == sizeof(int) * 9 + 4 + sizeof(void*) * 8);
|
||||||
|
G_STATIC_ASSERT(sizeof(OstreeRepoExportArchiveOptions) == sizeof(int) * 9 + 4 + 8 + sizeof(void*) * 8);
|
||||||
|
G_STATIC_ASSERT(sizeof(OstreeRepoCheckoutAtOptions) ==
|
||||||
|
sizeof(OstreeRepoCheckoutMode) + sizeof(OstreeRepoCheckoutOverwriteMode) +
|
||||||
|
sizeof(int)*6 +
|
||||||
|
sizeof(int)*5 +
|
||||||
|
sizeof(int) +
|
||||||
|
sizeof(void*)*2 +
|
||||||
|
sizeof(int)*6 +
|
||||||
|
sizeof(void*)*7);
|
||||||
|
G_STATIC_ASSERT(sizeof(OstreeRepoCommitTraverseIter) ==
|
||||||
|
sizeof(int) + sizeof(int) +
|
||||||
|
sizeof(void*) * 10 +
|
||||||
|
130 + 6); /* 6 byte hole */
|
||||||
|
G_STATIC_ASSERT(sizeof(OstreeRepoPruneOptions) ==
|
||||||
|
sizeof(OstreeRepoPruneFlags) +
|
||||||
|
4 +
|
||||||
|
sizeof(void*) +
|
||||||
|
sizeof(int) * 12 +
|
||||||
|
sizeof(void*) * 7);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:ostree-repo
|
* SECTION:ostree-repo
|
||||||
* @title: Content-addressed object store
|
* @title: OstreeRepo: Content-addressed object store
|
||||||
* @short_description: A git-like storage system for operating system binaries
|
* @short_description: A git-like storage system for operating system binaries
|
||||||
*
|
*
|
||||||
* The #OstreeRepo is like git, a content-addressed object store.
|
* The #OstreeRepo is like git, a content-addressed object store.
|
||||||
|
|
@ -556,14 +583,32 @@ ostree_repo_class_init (OstreeRepoClass *klass)
|
||||||
object_class->set_property = ostree_repo_set_property;
|
object_class->set_property = ostree_repo_set_property;
|
||||||
object_class->finalize = ostree_repo_finalize;
|
object_class->finalize = ostree_repo_finalize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OstreeRepo:path:
|
||||||
|
*
|
||||||
|
* Path to repository. Note that if this repository was created
|
||||||
|
* via `ostree_repo_new_at()`, this value will refer to a value in
|
||||||
|
* the Linux kernel's `/proc/self/fd` directory. Generally, you
|
||||||
|
* should avoid using this property at all; you can gain a reference
|
||||||
|
* to the repository's directory fd via `ostree_repo_get_dfd()` and
|
||||||
|
* use file-descriptor relative operations.
|
||||||
|
*/
|
||||||
g_object_class_install_property (object_class,
|
g_object_class_install_property (object_class,
|
||||||
PROP_PATH,
|
PROP_PATH,
|
||||||
g_param_spec_object ("path",
|
g_param_spec_object ("path", "Path", "Path",
|
||||||
"",
|
|
||||||
"",
|
|
||||||
G_TYPE_FILE,
|
G_TYPE_FILE,
|
||||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
/**
|
||||||
|
* OstreeRepo:sysroot-path:
|
||||||
|
*
|
||||||
|
* A system using libostree for the host has a "system" repository; this
|
||||||
|
* property will be set for repositories referenced via
|
||||||
|
* `ostree_sysroot_repo()` for example.
|
||||||
|
*
|
||||||
|
* You should avoid using this property; if your code is operating
|
||||||
|
* on a system repository, use `OstreeSysroot` and access the repository
|
||||||
|
* object via `ostree_sysroot_repo()`.
|
||||||
|
*/
|
||||||
g_object_class_install_property (object_class,
|
g_object_class_install_property (object_class,
|
||||||
PROP_SYSROOT_PATH,
|
PROP_SYSROOT_PATH,
|
||||||
g_param_spec_object ("sysroot-path",
|
g_param_spec_object ("sysroot-path",
|
||||||
|
|
@ -571,7 +616,15 @@ ostree_repo_class_init (OstreeRepoClass *klass)
|
||||||
"",
|
"",
|
||||||
G_TYPE_FILE,
|
G_TYPE_FILE,
|
||||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
/**
|
||||||
|
* OstreeRepo:remotes-config-dir:
|
||||||
|
*
|
||||||
|
* Path to directory containing remote definitions. The default is `NULL`.
|
||||||
|
* If a `sysroot-path` property is defined, this value will default to
|
||||||
|
* `${sysroot_path}/etc/ostree/remotes.d`.
|
||||||
|
*
|
||||||
|
* This value will only be used for system repositories.
|
||||||
|
*/
|
||||||
g_object_class_install_property (object_class,
|
g_object_class_install_property (object_class,
|
||||||
PROP_REMOTES_CONFIG_DIR,
|
PROP_REMOTES_CONFIG_DIR,
|
||||||
g_param_spec_string ("remotes-config-dir",
|
g_param_spec_string ("remotes-config-dir",
|
||||||
|
|
@ -880,6 +933,40 @@ ostree_repo_write_config (OstreeRepo *self,
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (self->inited, FALSE);
|
g_return_val_if_fail (self->inited, FALSE);
|
||||||
|
|
||||||
|
/* Ensure that any remotes in the new config aren't defined in a
|
||||||
|
* separate config file.
|
||||||
|
*/
|
||||||
|
gsize num_groups;
|
||||||
|
g_auto(GStrv) groups = g_key_file_get_groups (new_config, &num_groups);
|
||||||
|
for (gsize i = 0; i < num_groups; i++)
|
||||||
|
{
|
||||||
|
g_autoptr(OstreeRemote) new_remote = ostree_remote_new_from_keyfile (new_config, groups[i]);
|
||||||
|
if (new_remote != NULL)
|
||||||
|
{
|
||||||
|
g_autoptr(GError) local_error = NULL;
|
||||||
|
|
||||||
|
g_autoptr(OstreeRemote) cur_remote =
|
||||||
|
_ostree_repo_get_remote (self, new_remote->name, &local_error);
|
||||||
|
if (cur_remote == NULL)
|
||||||
|
{
|
||||||
|
if (!g_error_matches (local_error, G_IO_ERROR,
|
||||||
|
G_IO_ERROR_NOT_FOUND))
|
||||||
|
{
|
||||||
|
g_propagate_error (error, g_steal_pointer (&local_error));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (cur_remote->file != NULL)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_EXISTS,
|
||||||
|
"Remote \"%s\" already defined in %s",
|
||||||
|
new_remote->name,
|
||||||
|
gs_file_get_path_cached (cur_remote->file));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gsize len;
|
gsize len;
|
||||||
g_autofree char *data = g_key_file_to_data (new_config, &len, error);
|
g_autofree char *data = g_key_file_to_data (new_config, &len, error);
|
||||||
if (!glnx_file_replace_contents_at (self->repo_dir_fd, "config",
|
if (!glnx_file_replace_contents_at (self->repo_dir_fd, "config",
|
||||||
|
|
@ -957,8 +1044,12 @@ impl_repo_remote_add (OstreeRepo *self,
|
||||||
|
|
||||||
remote = ostree_remote_new (name);
|
remote = ostree_remote_new (name);
|
||||||
|
|
||||||
|
/* Only add repos in remotes.d if the repo option
|
||||||
|
* add-remotes-config-dir is true. This is the default for system
|
||||||
|
* repos.
|
||||||
|
*/
|
||||||
g_autoptr(GFile) etc_ostree_remotes_d = get_remotes_d_dir (self, sysroot);
|
g_autoptr(GFile) etc_ostree_remotes_d = get_remotes_d_dir (self, sysroot);
|
||||||
if (etc_ostree_remotes_d)
|
if (etc_ostree_remotes_d && self->add_remotes_config_dir)
|
||||||
{
|
{
|
||||||
g_autoptr(GError) local_error = NULL;
|
g_autoptr(GError) local_error = NULL;
|
||||||
|
|
||||||
|
|
@ -1076,8 +1167,8 @@ impl_repo_remote_delete (OstreeRepo *self,
|
||||||
|
|
||||||
if (remote->file != NULL)
|
if (remote->file != NULL)
|
||||||
{
|
{
|
||||||
if (unlink (gs_file_get_path_cached (remote->file)) != 0)
|
if (!glnx_unlinkat (AT_FDCWD, gs_file_get_path_cached (remote->file), 0, error))
|
||||||
return glnx_throw_errno (error);
|
return FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1412,8 +1503,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self,
|
||||||
gpg_error = gpgme_op_import (source_context, data_buffer);
|
gpg_error = gpgme_op_import (source_context, data_buffer);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to import keys");
|
||||||
g_prefix_error (error, "Unable to import keys: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1438,8 +1528,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self,
|
||||||
gpg_error = gpgme_get_key (source_context, key_ids[ii], &key, 0);
|
gpg_error = gpgme_get_key (source_context, key_ids[ii], &key, 0);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to find key \"%s\"", key_ids[ii]);
|
||||||
g_prefix_error (error, "Unable to find key \"%s\": ", key_ids[ii]);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1466,8 +1555,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self,
|
||||||
|
|
||||||
if (gpgme_err_code (gpg_error) != GPG_ERR_EOF)
|
if (gpgme_err_code (gpg_error) != GPG_ERR_EOF)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to list keys");
|
||||||
g_prefix_error (error, "Unable to list keys: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1539,8 +1627,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self,
|
||||||
gpg_error = gpgme_data_new (&data_buffer);
|
gpg_error = gpgme_data_new (&data_buffer);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to create data buffer");
|
||||||
g_prefix_error (error, "Unable to create data buffer: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1549,8 +1636,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self,
|
||||||
data_buffer);
|
data_buffer);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to export keys");
|
||||||
g_prefix_error (error, "Unable to export keys: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1559,8 +1645,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self,
|
||||||
gpg_error = gpgme_op_import (target_context, data_buffer);
|
gpg_error = gpgme_op_import (target_context, data_buffer);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to import keys");
|
||||||
g_prefix_error (error, "Unable to import keys: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1575,8 +1660,7 @@ ostree_repo_remote_gpg_import (OstreeRepo *self,
|
||||||
{
|
{
|
||||||
if (import_status->result != GPG_ERR_NO_ERROR)
|
if (import_status->result != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "Unable to import key \"%s\"",
|
||||||
g_prefix_error (error, "Unable to import key \"%s\": ",
|
|
||||||
import_status->fpr);
|
import_status->fpr);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
@ -1994,10 +2078,6 @@ static GFile *
|
||||||
get_remotes_d_dir (OstreeRepo *self,
|
get_remotes_d_dir (OstreeRepo *self,
|
||||||
GFile *sysroot)
|
GFile *sysroot)
|
||||||
{
|
{
|
||||||
/* Support explicit override */
|
|
||||||
if (self->sysroot_dir != NULL && self->remotes_config_dir != NULL)
|
|
||||||
return g_file_resolve_relative_path (self->sysroot_dir, self->remotes_config_dir);
|
|
||||||
|
|
||||||
g_autoptr(GFile) sysroot_owned = NULL;
|
g_autoptr(GFile) sysroot_owned = NULL;
|
||||||
/* Very complicated sysroot logic; this bit breaks the otherwise mostly clean
|
/* Very complicated sysroot logic; this bit breaks the otherwise mostly clean
|
||||||
* layering between OstreeRepo and OstreeSysroot. First, If a sysroot was
|
* layering between OstreeRepo and OstreeSysroot. First, If a sysroot was
|
||||||
|
|
@ -2033,10 +2113,18 @@ get_remotes_d_dir (OstreeRepo *self,
|
||||||
if (sysroot == NULL && sysroot_ref == NULL)
|
if (sysroot == NULL && sysroot_ref == NULL)
|
||||||
sysroot = self->sysroot_dir;
|
sysroot = self->sysroot_dir;
|
||||||
|
|
||||||
/* Did we find a sysroot? If not, NULL means use the repo config, otherwise
|
/* Was the config directory specified? If so, use that with the
|
||||||
* return the path in /etc.
|
* optional sysroot prepended. If not, return the path in /etc if the
|
||||||
|
* sysroot was found and NULL otherwise to use the repo config.
|
||||||
*/
|
*/
|
||||||
|
if (self->remotes_config_dir != NULL)
|
||||||
|
{
|
||||||
if (sysroot == NULL)
|
if (sysroot == NULL)
|
||||||
|
return g_file_new_for_path (self->remotes_config_dir);
|
||||||
|
else
|
||||||
|
return g_file_resolve_relative_path (sysroot, self->remotes_config_dir);
|
||||||
|
}
|
||||||
|
else if (sysroot == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
else
|
||||||
return g_file_resolve_relative_path (sysroot, SYSCONF_REMOTES);
|
return g_file_resolve_relative_path (sysroot, SYSCONF_REMOTES);
|
||||||
|
|
@ -2178,6 +2266,17 @@ reload_core_config (OstreeRepo *self,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* By default, only add remotes in a remotes config directory for
|
||||||
|
* system repos. This is to preserve legacy behavior for non-system
|
||||||
|
* repos that specify a remotes config dir (flatpak).
|
||||||
|
*/
|
||||||
|
{ gboolean is_system = ostree_repo_is_system (self);
|
||||||
|
|
||||||
|
if (!ot_keyfile_get_boolean_with_default (self->config, "core", "add-remotes-config-dir",
|
||||||
|
is_system, &self->add_remotes_config_dir, error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2316,8 +2415,8 @@ ostree_repo_open (OstreeRepo *self,
|
||||||
/* Note - we don't return this error yet! */
|
/* Note - we don't return this error yet! */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fstat (self->objects_dir_fd, &stbuf) != 0)
|
if (!glnx_fstat (self->objects_dir_fd, &stbuf, error))
|
||||||
return glnx_throw_errno (error);
|
return FALSE;
|
||||||
self->owner_uid = stbuf.st_uid;
|
self->owner_uid = stbuf.st_uid;
|
||||||
|
|
||||||
if (stbuf.st_uid != getuid () || stbuf.st_gid != getgid ())
|
if (stbuf.st_uid != getuid () || stbuf.st_gid != getgid ())
|
||||||
|
|
@ -2703,8 +2802,8 @@ load_metadata_internal (OstreeRepo *self,
|
||||||
|
|
||||||
if (fd != -1)
|
if (fd != -1)
|
||||||
{
|
{
|
||||||
if (fstat (fd, &stbuf) < 0)
|
if (!glnx_fstat (fd, &stbuf, error))
|
||||||
return glnx_throw_errno (error);
|
return FALSE;
|
||||||
|
|
||||||
if (out_variant)
|
if (out_variant)
|
||||||
{
|
{
|
||||||
|
|
@ -3127,7 +3226,7 @@ _ostree_repo_has_loose_object (OstreeRepo *self,
|
||||||
if (errno == ENOENT)
|
if (errno == ENOENT)
|
||||||
; /* Next dfd */
|
; /* Next dfd */
|
||||||
else
|
else
|
||||||
return glnx_throw_errno (error);
|
return glnx_throw_errno_prefix (error, "fstatat(%s)", loose_path_buf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -3210,15 +3309,12 @@ ostree_repo_delete_object (OstreeRepo *self,
|
||||||
|
|
||||||
_ostree_loose_path (meta_loose, sha256, OSTREE_OBJECT_TYPE_COMMIT_META, self->mode);
|
_ostree_loose_path (meta_loose, sha256, OSTREE_OBJECT_TYPE_COMMIT_META, self->mode);
|
||||||
|
|
||||||
if (TEMP_FAILURE_RETRY (unlinkat (self->objects_dir_fd, meta_loose, 0)) < 0)
|
if (!ot_ensure_unlinked_at (self->objects_dir_fd, meta_loose, error))
|
||||||
{
|
return FALSE;
|
||||||
if (G_UNLIKELY (errno != ENOENT))
|
|
||||||
return glnx_throw_errno_prefix (error, "unlinkat(%s)", meta_loose);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TEMP_FAILURE_RETRY (unlinkat (self->objects_dir_fd, loose_path, 0)) < 0)
|
if (!glnx_unlinkat (self->objects_dir_fd, loose_path, 0, error))
|
||||||
return glnx_throw_errno_prefix (error, "Deleting object %s.%s", sha256, ostree_object_type_to_string (objtype));
|
return glnx_prefix_error (error, "Deleting object %s.%s", sha256, ostree_object_type_to_string (objtype));
|
||||||
|
|
||||||
/* If the repository is configured to use tombstone commits, create one when deleting a commit. */
|
/* If the repository is configured to use tombstone commits, create one when deleting a commit. */
|
||||||
if (objtype == OSTREE_OBJECT_TYPE_COMMIT)
|
if (objtype == OSTREE_OBJECT_TYPE_COMMIT)
|
||||||
|
|
@ -3297,6 +3393,9 @@ import_one_object_link (OstreeRepo *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
const char *errprefix = glnx_strjoina ("Importing ", checksum, ".",
|
||||||
|
ostree_object_type_to_string (objtype));
|
||||||
|
GLNX_AUTO_PREFIX_ERROR (errprefix, error);
|
||||||
char loose_path_buf[_OSTREE_LOOSE_PATH_MAX];
|
char loose_path_buf[_OSTREE_LOOSE_PATH_MAX];
|
||||||
_ostree_loose_path (loose_path_buf, checksum, objtype, self->mode);
|
_ostree_loose_path (loose_path_buf, checksum, objtype, self->mode);
|
||||||
|
|
||||||
|
|
@ -3343,7 +3442,7 @@ import_one_object_link (OstreeRepo *self,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return glnx_throw_errno (error);
|
return glnx_throw_errno_prefix (error, "linkat");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (objtype == OSTREE_OBJECT_TYPE_COMMIT)
|
if (objtype == OSTREE_OBJECT_TYPE_COMMIT)
|
||||||
|
|
@ -3650,7 +3749,7 @@ ostree_repo_load_commit (OstreeRepo *self,
|
||||||
}
|
}
|
||||||
else if (errno != ENOENT)
|
else if (errno != ENOENT)
|
||||||
{
|
{
|
||||||
return glnx_throw_errno (error);
|
return glnx_throw_errno_prefix (error, "fstatat(%s)", commitpartial_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4123,16 +4222,14 @@ sign_data (OstreeRepo *self,
|
||||||
}
|
}
|
||||||
else if (err != GPG_ERR_NO_ERROR)
|
else if (err != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (err, error);
|
ot_gpgme_throw (err, error, "Unable to lookup key ID %s", key_id);
|
||||||
g_prefix_error (error, "Unable to lookup key ID %s: ", key_id);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add the key to the context as a signer */
|
/* Add the key to the context as a signer */
|
||||||
if ((err = gpgme_signers_add (context, key)) != GPG_ERR_NO_ERROR)
|
if ((err = gpgme_signers_add (context, key)) != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (err, error);
|
ot_gpgme_throw (err, error, "Error signing commit");
|
||||||
g_prefix_error (error, "Error signing commit: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4141,8 +4238,7 @@ sign_data (OstreeRepo *self,
|
||||||
const char *buf = g_bytes_get_data (input_data, &len);
|
const char *buf = g_bytes_get_data (input_data, &len);
|
||||||
if ((err = gpgme_data_new_from_mem (&commit_buffer, buf, len, FALSE)) != GPG_ERR_NO_ERROR)
|
if ((err = gpgme_data_new_from_mem (&commit_buffer, buf, len, FALSE)) != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (err, error);
|
ot_gpgme_throw (err, error, "Failed to create buffer from commit file");
|
||||||
g_prefix_error (error, "Failed to create buffer from commit file: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4152,8 +4248,7 @@ sign_data (OstreeRepo *self,
|
||||||
if ((err = gpgme_op_sign (context, commit_buffer, signature_buffer, GPGME_SIG_MODE_DETACH))
|
if ((err = gpgme_op_sign (context, commit_buffer, signature_buffer, GPGME_SIG_MODE_DETACH))
|
||||||
!= GPG_ERR_NO_ERROR)
|
!= GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (err, error);
|
ot_gpgme_throw (err, error, "Failure signing commit file");
|
||||||
g_prefix_error (error, "Failure signing commit file: ");
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4219,11 +4314,14 @@ ostree_repo_sign_commit (OstreeRepo *self,
|
||||||
|
|
||||||
/* The verify operation is merely to parse any existing signatures to
|
/* The verify operation is merely to parse any existing signatures to
|
||||||
* check if the commit has already been signed with the given key ID.
|
* check if the commit has already been signed with the given key ID.
|
||||||
* We want to avoid storing duplicate signatures in the metadata. */
|
* We want to avoid storing duplicate signatures in the metadata. We
|
||||||
|
* pass the homedir so that the signing key can be imported, allowing
|
||||||
|
* subkey signatures to be recognised. */
|
||||||
g_autoptr(GError) local_error = NULL;
|
g_autoptr(GError) local_error = NULL;
|
||||||
|
g_autoptr(GFile) verify_keydir = g_file_new_for_path (homedir);
|
||||||
g_autoptr(OstreeGpgVerifyResult) result
|
g_autoptr(OstreeGpgVerifyResult) result
|
||||||
=_ostree_repo_gpg_verify_with_metadata (self, commit_data, old_metadata,
|
=_ostree_repo_gpg_verify_with_metadata (self, commit_data, old_metadata,
|
||||||
NULL, NULL, NULL,
|
NULL, verify_keydir, NULL,
|
||||||
cancellable, &local_error);
|
cancellable, &local_error);
|
||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
|
|
@ -4534,32 +4632,23 @@ _ostree_repo_verify_commit_internal (OstreeRepo *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
OstreeGpgVerifyResult *result = NULL;
|
|
||||||
g_autoptr(GVariant) commit_variant = NULL;
|
g_autoptr(GVariant) commit_variant = NULL;
|
||||||
g_autoptr(GVariant) metadata = NULL;
|
|
||||||
g_autoptr(GBytes) signed_data = NULL;
|
|
||||||
|
|
||||||
/* Load the commit */
|
/* Load the commit */
|
||||||
if (!ostree_repo_load_variant (self, OSTREE_OBJECT_TYPE_COMMIT,
|
if (!ostree_repo_load_variant (self, OSTREE_OBJECT_TYPE_COMMIT,
|
||||||
commit_checksum, &commit_variant,
|
commit_checksum, &commit_variant,
|
||||||
error))
|
error))
|
||||||
{
|
return glnx_prefix_error_null (error, "Failed to read commit");
|
||||||
g_prefix_error (error, "Failed to read commit: ");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Load the metadata */
|
/* Load the metadata */
|
||||||
|
g_autoptr(GVariant) metadata = NULL;
|
||||||
if (!ostree_repo_read_commit_detached_metadata (self,
|
if (!ostree_repo_read_commit_detached_metadata (self,
|
||||||
commit_checksum,
|
commit_checksum,
|
||||||
&metadata,
|
&metadata,
|
||||||
cancellable,
|
cancellable,
|
||||||
error))
|
error))
|
||||||
{
|
return glnx_prefix_error_null (error, "Failed to read detached metadata");
|
||||||
g_prefix_error (error, "Failed to read detached metadata: ");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
signed_data = g_variant_get_data_as_bytes (commit_variant);
|
g_autoptr(GBytes) signed_data = g_variant_get_data_as_bytes (commit_variant);
|
||||||
|
|
||||||
/* XXX This is a hackish way to indicate to use ALL remote-specific
|
/* XXX This is a hackish way to indicate to use ALL remote-specific
|
||||||
* keyrings in the signature verification. We want this when
|
* keyrings in the signature verification. We want this when
|
||||||
|
|
@ -4567,17 +4656,10 @@ _ostree_repo_verify_commit_internal (OstreeRepo *self,
|
||||||
if (remote_name == NULL)
|
if (remote_name == NULL)
|
||||||
remote_name = OSTREE_ALL_REMOTES;
|
remote_name = OSTREE_ALL_REMOTES;
|
||||||
|
|
||||||
result = _ostree_repo_gpg_verify_with_metadata (self,
|
return _ostree_repo_gpg_verify_with_metadata (self, signed_data,
|
||||||
signed_data,
|
metadata, remote_name,
|
||||||
metadata,
|
keyringdir, extra_keyring,
|
||||||
remote_name,
|
cancellable, error);
|
||||||
keyringdir,
|
|
||||||
extra_keyring,
|
|
||||||
cancellable,
|
|
||||||
error);
|
|
||||||
|
|
||||||
out:
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -4609,10 +4691,7 @@ ostree_repo_verify_commit (OstreeRepo *self,
|
||||||
cancellable, error);
|
cancellable, error);
|
||||||
|
|
||||||
if (!ostree_gpg_verify_result_require_valid_signature (result, error))
|
if (!ostree_gpg_verify_result_require_valid_signature (result, error))
|
||||||
{
|
return glnx_prefix_error (error, "Commit %s", commit_checksum);
|
||||||
g_prefix_error (error, "Commit %s: ", commit_checksum);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4907,14 +4986,12 @@ ostree_repo_regenerate_summary (OstreeRepo *self,
|
||||||
g_variant_new_uint64 (GUINT64_TO_BE (g_get_real_time () / G_USEC_PER_SEC)));
|
g_variant_new_uint64 (GUINT64_TO_BE (g_get_real_time () / G_USEC_PER_SEC)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add refs which have a collection specified. ostree_repo_list_collection_refs()
|
/* Add refs which have a collection specified, which could be in refs/mirrors,
|
||||||
* is guaranteed to only return refs which are in refs/mirrors, or those which
|
* refs/heads, and/or refs/remotes. */
|
||||||
* are in refs/heads if the repository configuration specifies a collection ID
|
|
||||||
* (which we put in the main refs map, rather than the collection map, for
|
|
||||||
* backwards compatibility). */
|
|
||||||
{
|
{
|
||||||
g_autoptr(GHashTable) collection_refs = NULL;
|
g_autoptr(GHashTable) collection_refs = NULL;
|
||||||
if (!ostree_repo_list_collection_refs (self, NULL, &collection_refs, cancellable, error))
|
if (!ostree_repo_list_collection_refs (self, NULL, &collection_refs,
|
||||||
|
OSTREE_REPO_LIST_REFS_EXT_NONE, cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
gsize collection_map_size = 0;
|
gsize collection_map_size = 0;
|
||||||
|
|
@ -4949,6 +5026,8 @@ ostree_repo_regenerate_summary (OstreeRepo *self,
|
||||||
const char *collection_id = collection_iter->data;
|
const char *collection_id = collection_iter->data;
|
||||||
GHashTable *ref_map = g_hash_table_lookup (collection_map, collection_id);
|
GHashTable *ref_map = g_hash_table_lookup (collection_map, collection_id);
|
||||||
|
|
||||||
|
/* We put the local repo's collection ID in the main refs map, rather
|
||||||
|
* than the collection map, for backwards compatibility. */
|
||||||
gboolean is_main_collection_id = (main_collection_id != NULL && g_str_equal (collection_id, main_collection_id));
|
gboolean is_main_collection_id = (main_collection_id != NULL && g_str_equal (collection_id, main_collection_id));
|
||||||
|
|
||||||
if (!is_main_collection_id)
|
if (!is_main_collection_id)
|
||||||
|
|
@ -5009,11 +5088,8 @@ ostree_repo_regenerate_summary (OstreeRepo *self,
|
||||||
error))
|
error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (unlinkat (self->repo_dir_fd, "summary.sig", 0) < 0)
|
if (!ot_ensure_unlinked_at (self->repo_dir_fd, "summary.sig", error))
|
||||||
{
|
return FALSE;
|
||||||
if (errno != ENOENT)
|
|
||||||
return glnx_throw_errno_prefix (error, "unlinkat");
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
@ -5072,19 +5148,17 @@ _ostree_repo_allocate_tmpdir (int tmpdir_dfd,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
gboolean reusing_dir = FALSE;
|
|
||||||
gboolean did_lock;
|
|
||||||
g_autofree char *tmpdir_name = NULL;
|
|
||||||
glnx_fd_close int tmpdir_fd = -1;
|
|
||||||
g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
|
|
||||||
|
|
||||||
g_return_val_if_fail (_ostree_repo_is_locked_tmpdir (tmpdir_prefix), FALSE);
|
g_return_val_if_fail (_ostree_repo_is_locked_tmpdir (tmpdir_prefix), FALSE);
|
||||||
|
|
||||||
/* Look for existing tmpdir (with same prefix) to reuse */
|
/* Look for existing tmpdir (with same prefix) to reuse */
|
||||||
|
g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
|
||||||
if (!glnx_dirfd_iterator_init_at (tmpdir_dfd, ".", FALSE, &dfd_iter, error))
|
if (!glnx_dirfd_iterator_init_at (tmpdir_dfd, ".", FALSE, &dfd_iter, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
|
gboolean reusing_dir = FALSE;
|
||||||
|
gboolean did_lock = FALSE;
|
||||||
|
g_autofree char *tmpdir_name = NULL;
|
||||||
|
glnx_fd_close int tmpdir_fd = -1;
|
||||||
while (tmpdir_name == NULL)
|
while (tmpdir_name == NULL)
|
||||||
{
|
{
|
||||||
struct dirent *dent;
|
struct dirent *dent;
|
||||||
|
|
@ -5092,7 +5166,7 @@ _ostree_repo_allocate_tmpdir (int tmpdir_dfd,
|
||||||
g_autoptr(GError) local_error = NULL;
|
g_autoptr(GError) local_error = NULL;
|
||||||
|
|
||||||
if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
|
if (!glnx_dirfd_iterator_next_dent (&dfd_iter, &dent, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (dent == NULL)
|
if (dent == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
@ -5113,7 +5187,7 @@ _ostree_repo_allocate_tmpdir (int tmpdir_dfd,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_propagate_error (error, g_steal_pointer (&local_error));
|
g_propagate_error (error, g_steal_pointer (&local_error));
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5122,12 +5196,12 @@ _ostree_repo_allocate_tmpdir (int tmpdir_dfd,
|
||||||
if (!_ostree_repo_try_lock_tmpdir (tmpdir_dfd, dent->d_name,
|
if (!_ostree_repo_try_lock_tmpdir (tmpdir_dfd, dent->d_name,
|
||||||
file_lock_out, &did_lock,
|
file_lock_out, &did_lock,
|
||||||
error))
|
error))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (!did_lock)
|
if (!did_lock)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Touch the reused directory so that we don't accidentally
|
/* Touch the reused directory so that we don't accidentally
|
||||||
* remove it due to being old when cleaning up the tmpdir
|
* remove it due to being old when cleaning up the tmpdir.
|
||||||
*/
|
*/
|
||||||
(void)futimens (existing_tmpdir_fd, NULL);
|
(void)futimens (existing_tmpdir_fd, NULL);
|
||||||
|
|
||||||
|
|
@ -5139,24 +5213,22 @@ _ostree_repo_allocate_tmpdir (int tmpdir_dfd,
|
||||||
|
|
||||||
while (tmpdir_name == NULL)
|
while (tmpdir_name == NULL)
|
||||||
{
|
{
|
||||||
g_autofree char *tmpdir_name_template = g_strconcat (tmpdir_prefix, "XXXXXX", NULL);
|
|
||||||
glnx_fd_close int new_tmpdir_fd = -1;
|
|
||||||
|
|
||||||
/* No existing tmpdir found, create a new */
|
/* No existing tmpdir found, create a new */
|
||||||
|
g_autofree char *tmpdir_name_template = g_strconcat (tmpdir_prefix, "XXXXXX", NULL);
|
||||||
if (!glnx_mkdtempat (tmpdir_dfd, tmpdir_name_template, 0777, error))
|
if (!glnx_mkdtempat (tmpdir_dfd, tmpdir_name_template, 0777, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
|
glnx_fd_close int new_tmpdir_fd = -1;
|
||||||
if (!glnx_opendirat (tmpdir_dfd, tmpdir_name_template, FALSE,
|
if (!glnx_opendirat (tmpdir_dfd, tmpdir_name_template, FALSE,
|
||||||
&new_tmpdir_fd, error))
|
&new_tmpdir_fd, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
/* Note, at this point we can race with another process that picks up this
|
/* Note, at this point we can race with another process that picks up this
|
||||||
* new directory. If that happens we need to retry, making a new directory. */
|
* new directory. If that happens we need to retry, making a new directory. */
|
||||||
if (!_ostree_repo_try_lock_tmpdir (tmpdir_dfd, tmpdir_name_template,
|
if (!_ostree_repo_try_lock_tmpdir (tmpdir_dfd, tmpdir_name_template,
|
||||||
file_lock_out, &did_lock,
|
file_lock_out, &did_lock,
|
||||||
error))
|
error))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (!did_lock)
|
if (!did_lock)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
@ -5166,16 +5238,11 @@ _ostree_repo_allocate_tmpdir (int tmpdir_dfd,
|
||||||
|
|
||||||
if (tmpdir_name_out)
|
if (tmpdir_name_out)
|
||||||
*tmpdir_name_out = g_steal_pointer (&tmpdir_name);
|
*tmpdir_name_out = g_steal_pointer (&tmpdir_name);
|
||||||
|
|
||||||
if (tmpdir_fd_out)
|
if (tmpdir_fd_out)
|
||||||
*tmpdir_fd_out = glnx_steal_fd (&tmpdir_fd);
|
*tmpdir_fd_out = glnx_steal_fd (&tmpdir_fd);
|
||||||
|
|
||||||
if (reusing_dir_out)
|
if (reusing_dir_out)
|
||||||
*reusing_dir_out = reusing_dir;
|
*reusing_dir_out = reusing_dir;
|
||||||
|
return TRUE;
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See ostree-repo-private.h for more information about this */
|
/* See ostree-repo-private.h for more information about this */
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "ostree-core.h"
|
#include "ostree-core.h"
|
||||||
#include "ostree-types.h"
|
#include "ostree-types.h"
|
||||||
#include "ostree-async-progress.h"
|
#include "ostree-async-progress.h"
|
||||||
|
|
@ -475,10 +477,12 @@ gboolean ostree_repo_list_refs (OstreeRepo *self,
|
||||||
* OstreeRepoListRefsExtFlags:
|
* OstreeRepoListRefsExtFlags:
|
||||||
* @OSTREE_REPO_LIST_REFS_EXT_NONE: No flags.
|
* @OSTREE_REPO_LIST_REFS_EXT_NONE: No flags.
|
||||||
* @OSTREE_REPO_LIST_REFS_EXT_ALIASES: Only list aliases. Since: 2017.10
|
* @OSTREE_REPO_LIST_REFS_EXT_ALIASES: Only list aliases. Since: 2017.10
|
||||||
|
* @OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES: Exclude remote refs. Since: 2017.11
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
OSTREE_REPO_LIST_REFS_EXT_NONE = 0,
|
OSTREE_REPO_LIST_REFS_EXT_NONE = 0,
|
||||||
OSTREE_REPO_LIST_REFS_EXT_ALIASES = 1,
|
OSTREE_REPO_LIST_REFS_EXT_ALIASES = (1 << 0),
|
||||||
|
OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES = (1 << 1),
|
||||||
} OstreeRepoListRefsExtFlags;
|
} OstreeRepoListRefsExtFlags;
|
||||||
|
|
||||||
_OSTREE_PUBLIC
|
_OSTREE_PUBLIC
|
||||||
|
|
@ -686,6 +690,31 @@ gboolean ostree_repo_write_archive_to_mtree (OstreeRepo *
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OstreeRepoImportArchiveTranslatePathname:
|
||||||
|
* @repo: Repo
|
||||||
|
* @stbuf: Stat buffer
|
||||||
|
* @src_path: Path in the archive
|
||||||
|
* @user_data: User data
|
||||||
|
*
|
||||||
|
* Possibly change a pathname while importing an archive. If %NULL is returned,
|
||||||
|
* then @src_path will be used unchanged. Otherwise, return a new pathname which
|
||||||
|
* will be freed via `g_free()`.
|
||||||
|
*
|
||||||
|
* This pathname translation will be performed *before* any processing from an
|
||||||
|
* active `OstreeRepoCommitModifier`. Will be invoked for all directory and file
|
||||||
|
* types, first with outer directories, then their sub-files and directories.
|
||||||
|
*
|
||||||
|
* Note that enabling pathname translation will always override the setting for
|
||||||
|
* `use_ostree_convention`.
|
||||||
|
*
|
||||||
|
* Since: 2017.11
|
||||||
|
*/
|
||||||
|
typedef char *(*OstreeRepoImportArchiveTranslatePathname) (OstreeRepo *repo,
|
||||||
|
const struct stat *stbuf,
|
||||||
|
const char *src_path,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OstreeRepoImportArchiveOptions: (skip)
|
* OstreeRepoImportArchiveOptions: (skip)
|
||||||
*
|
*
|
||||||
|
|
@ -701,7 +730,9 @@ typedef struct {
|
||||||
guint reserved : 28;
|
guint reserved : 28;
|
||||||
|
|
||||||
guint unused_uint[8];
|
guint unused_uint[8];
|
||||||
gpointer unused_ptrs[8];
|
OstreeRepoImportArchiveTranslatePathname translate_pathname;
|
||||||
|
gpointer translate_pathname_user_data;
|
||||||
|
gpointer unused_ptrs[6];
|
||||||
} OstreeRepoImportArchiveOptions;
|
} OstreeRepoImportArchiveOptions;
|
||||||
|
|
||||||
_OSTREE_PUBLIC
|
_OSTREE_PUBLIC
|
||||||
|
|
@ -724,6 +755,7 @@ typedef struct {
|
||||||
guint disable_xattrs : 1;
|
guint disable_xattrs : 1;
|
||||||
guint reserved : 31;
|
guint reserved : 31;
|
||||||
|
|
||||||
|
/* 4 byte hole on 64 bit arches */
|
||||||
guint64 timestamp_secs;
|
guint64 timestamp_secs;
|
||||||
|
|
||||||
guint unused_uint[8];
|
guint unused_uint[8];
|
||||||
|
|
@ -800,11 +832,13 @@ typedef enum {
|
||||||
* @OSTREE_REPO_CHECKOUT_OVERWRITE_NONE: No special options
|
* @OSTREE_REPO_CHECKOUT_OVERWRITE_NONE: No special options
|
||||||
* @OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES: When layering checkouts, unlink() and replace existing files, but do not modify existing directories
|
* @OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES: When layering checkouts, unlink() and replace existing files, but do not modify existing directories
|
||||||
* @OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES: Only add new files/directories
|
* @OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES: Only add new files/directories
|
||||||
|
* @OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL: Like UNION_FILES, but error if files are not identical (requires hardlink checkouts)
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
OSTREE_REPO_CHECKOUT_OVERWRITE_NONE = 0,
|
OSTREE_REPO_CHECKOUT_OVERWRITE_NONE = 0,
|
||||||
OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES = 1,
|
OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES = 1,
|
||||||
OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES = 2, /* Since: 2017.3 */
|
OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES = 2, /* Since: 2017.3 */
|
||||||
|
OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL = 3, /* Since: 2017.11 */
|
||||||
} OstreeRepoCheckoutOverwriteMode;
|
} OstreeRepoCheckoutOverwriteMode;
|
||||||
|
|
||||||
_OSTREE_PUBLIC
|
_OSTREE_PUBLIC
|
||||||
|
|
@ -838,6 +872,7 @@ typedef struct {
|
||||||
gboolean force_copy; /* Since: 2017.6 */
|
gboolean force_copy; /* Since: 2017.6 */
|
||||||
gboolean bareuseronly_dirs; /* Since: 2017.7 */
|
gboolean bareuseronly_dirs; /* Since: 2017.7 */
|
||||||
gboolean unused_bools[5];
|
gboolean unused_bools[5];
|
||||||
|
/* 4 byte hole on 64 bit */
|
||||||
|
|
||||||
const char *subpath;
|
const char *subpath;
|
||||||
|
|
||||||
|
|
@ -972,6 +1007,7 @@ gboolean ostree_repo_traverse_commit_union (OstreeRepo *repo,
|
||||||
|
|
||||||
struct _OstreeRepoCommitTraverseIter {
|
struct _OstreeRepoCommitTraverseIter {
|
||||||
gboolean initialized;
|
gboolean initialized;
|
||||||
|
/* 4 byte hole on 64 bit */
|
||||||
gpointer dummy[10];
|
gpointer dummy[10];
|
||||||
char dummy_checksum_data[(OSTREE_SHA256_STRING_LEN+1)*2];
|
char dummy_checksum_data[(OSTREE_SHA256_STRING_LEN+1)*2];
|
||||||
};
|
};
|
||||||
|
|
@ -1060,6 +1096,8 @@ gboolean ostree_repo_prune (OstreeRepo *self,
|
||||||
struct _OstreeRepoPruneOptions {
|
struct _OstreeRepoPruneOptions {
|
||||||
OstreeRepoPruneFlags flags;
|
OstreeRepoPruneFlags flags;
|
||||||
|
|
||||||
|
/* 4 byte hole on 64 bit */
|
||||||
|
|
||||||
GHashTable *reachable; /* Set<GVariant> (object names) */
|
GHashTable *reachable; /* Set<GVariant> (object names) */
|
||||||
|
|
||||||
gboolean unused_bools[6];
|
gboolean unused_bools[6];
|
||||||
|
|
@ -1081,7 +1119,7 @@ gboolean ostree_repo_prune_from_reachable (OstreeRepo *self,
|
||||||
/**
|
/**
|
||||||
* OstreeRepoPullFlags:
|
* OstreeRepoPullFlags:
|
||||||
* @OSTREE_REPO_PULL_FLAGS_NONE: No special options for pull
|
* @OSTREE_REPO_PULL_FLAGS_NONE: No special options for pull
|
||||||
* @OSTREE_REPO_PULL_FLAGS_MIRROR: Write out refs suitable for mirrors
|
* @OSTREE_REPO_PULL_FLAGS_MIRROR: Write out refs suitable for mirrors and fetch all refs if none requested
|
||||||
* @OSTREE_REPO_PULL_FLAGS_COMMIT_ONLY: Fetch only the commit metadata
|
* @OSTREE_REPO_PULL_FLAGS_COMMIT_ONLY: Fetch only the commit metadata
|
||||||
* @OSTREE_REPO_PULL_FLAGS_UNTRUSTED: Don't trust local remote
|
* @OSTREE_REPO_PULL_FLAGS_UNTRUSTED: Don't trust local remote
|
||||||
* @OSTREE_REPO_PULL_FLAGS_BAREUSERONLY_FILES: Since 2017.7. Reject writes of content objects with modes outside of 0775.
|
* @OSTREE_REPO_PULL_FLAGS_BAREUSERONLY_FILES: Since 2017.7. Reject writes of content objects with modes outside of 0775.
|
||||||
|
|
@ -1188,6 +1226,7 @@ _OSTREE_PUBLIC
|
||||||
gboolean ostree_repo_list_collection_refs (OstreeRepo *self,
|
gboolean ostree_repo_list_collection_refs (OstreeRepo *self,
|
||||||
const char *match_collection_id,
|
const char *match_collection_id,
|
||||||
GHashTable **out_all_refs,
|
GHashTable **out_all_refs,
|
||||||
|
OstreeRepoListRefsExtFlags flags,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -521,7 +521,7 @@ ostree_sepolicy_get_label (OstreeSePolicy *self,
|
||||||
if (errno == ENOENT)
|
if (errno == ENOENT)
|
||||||
*out_label = NULL;
|
*out_label = NULL;
|
||||||
else
|
else
|
||||||
return glnx_throw_errno (error);
|
return glnx_throw_errno_prefix (error, "selabel_lookup");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "otutil.h"
|
#include "otutil.h"
|
||||||
|
#include "ostree-repo-private.h"
|
||||||
#include "ostree-linuxfsutil.h"
|
#include "ostree-linuxfsutil.h"
|
||||||
|
|
||||||
#include "ostree-sysroot-private.h"
|
#include "ostree-sysroot-private.h"
|
||||||
|
|
@ -201,73 +202,64 @@ list_all_boot_directories (OstreeSysroot *self,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A sysroot has at most one active "boot version" (pair of version,subversion)
|
||||||
|
* out of a total of 4 possible. This function deletes from the filesystem the 3
|
||||||
|
* other versions that aren't active.
|
||||||
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
cleanup_other_bootversions (OstreeSysroot *self,
|
cleanup_other_bootversions (OstreeSysroot *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
const int cleanup_bootversion = self->bootversion == 0 ? 1 : 0;
|
||||||
int cleanup_bootversion;
|
const int cleanup_subbootversion = self->subbootversion == 0 ? 1 : 0;
|
||||||
int cleanup_subbootversion;
|
/* Reusable buffer for path */
|
||||||
g_autoptr(GFile) cleanup_boot_dir = NULL;
|
g_autoptr(GString) buf = g_string_new ("");
|
||||||
|
|
||||||
cleanup_bootversion = self->bootversion == 0 ? 1 : 0;
|
/* These directories are for the other major version */
|
||||||
cleanup_subbootversion = self->subbootversion == 0 ? 1 : 0;
|
g_string_truncate (buf, 0); g_string_append_printf (buf, "boot/loader.%d", cleanup_bootversion);
|
||||||
|
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, buf->str, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
g_string_truncate (buf, 0); g_string_append_printf (buf, "ostree/boot.%d", cleanup_bootversion);
|
||||||
|
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, buf->str, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
g_string_truncate (buf, 0); g_string_append_printf (buf, "ostree/boot.%d.0", cleanup_bootversion);
|
||||||
|
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, buf->str, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
g_string_truncate (buf, 0); g_string_append_printf (buf, "ostree/boot.%d.1", cleanup_bootversion);
|
||||||
|
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, buf->str, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
cleanup_boot_dir = ot_gfile_resolve_path_printf (self->path, "boot/loader.%d", cleanup_bootversion);
|
/* And finally the other subbootversion */
|
||||||
if (!glnx_shutil_rm_rf_at (AT_FDCWD, gs_file_get_path_cached (cleanup_boot_dir), cancellable, error))
|
g_string_truncate (buf, 0); g_string_append_printf (buf, "ostree/boot.%d.%d", self->bootversion, cleanup_subbootversion);
|
||||||
goto out;
|
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, buf->str, cancellable, error))
|
||||||
g_clear_object (&cleanup_boot_dir);
|
return FALSE;
|
||||||
|
|
||||||
cleanup_boot_dir = ot_gfile_resolve_path_printf (self->path, "ostree/boot.%d", cleanup_bootversion);
|
return TRUE;
|
||||||
if (!glnx_shutil_rm_rf_at (AT_FDCWD, gs_file_get_path_cached (cleanup_boot_dir), cancellable, error))
|
|
||||||
goto out;
|
|
||||||
g_clear_object (&cleanup_boot_dir);
|
|
||||||
|
|
||||||
cleanup_boot_dir = ot_gfile_resolve_path_printf (self->path, "ostree/boot.%d.0", cleanup_bootversion);
|
|
||||||
if (!glnx_shutil_rm_rf_at (AT_FDCWD, gs_file_get_path_cached (cleanup_boot_dir), cancellable, error))
|
|
||||||
goto out;
|
|
||||||
g_clear_object (&cleanup_boot_dir);
|
|
||||||
|
|
||||||
cleanup_boot_dir = ot_gfile_resolve_path_printf (self->path, "ostree/boot.%d.1", cleanup_bootversion);
|
|
||||||
if (!glnx_shutil_rm_rf_at (AT_FDCWD, gs_file_get_path_cached (cleanup_boot_dir), cancellable, error))
|
|
||||||
goto out;
|
|
||||||
g_clear_object (&cleanup_boot_dir);
|
|
||||||
|
|
||||||
cleanup_boot_dir = ot_gfile_resolve_path_printf (self->path, "ostree/boot.%d.%d", self->bootversion,
|
|
||||||
cleanup_subbootversion);
|
|
||||||
if (!glnx_shutil_rm_rf_at (AT_FDCWD, gs_file_get_path_cached (cleanup_boot_dir), cancellable, error))
|
|
||||||
goto out;
|
|
||||||
g_clear_object (&cleanup_boot_dir);
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* As the bootloader configuration changes, we will have leftover deployments
|
||||||
|
* on disk. This function deletes all deployments which aren't actively
|
||||||
|
* referenced.
|
||||||
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
cleanup_old_deployments (OstreeSysroot *self,
|
cleanup_old_deployments (OstreeSysroot *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
/* Gather the device/inode of the rootfs, so we can double
|
||||||
|
* check we won't delete it.
|
||||||
|
*/
|
||||||
struct stat root_stbuf;
|
struct stat root_stbuf;
|
||||||
guint i;
|
if (!glnx_fstatat (AT_FDCWD, "/", &root_stbuf, 0, error))
|
||||||
g_autoptr(GHashTable) active_deployment_dirs = NULL;
|
return FALSE;
|
||||||
g_autoptr(GHashTable) active_boot_checksums = NULL;
|
|
||||||
g_autoptr(GPtrArray) all_deployment_dirs = NULL;
|
|
||||||
g_autoptr(GPtrArray) all_boot_dirs = NULL;
|
|
||||||
|
|
||||||
if (stat ("/", &root_stbuf) != 0)
|
/* Load all active deployments referenced by bootloader configuration. */
|
||||||
{
|
g_autoptr(GHashTable) active_deployment_dirs =
|
||||||
glnx_set_error_from_errno (error);
|
g_hash_table_new_full (g_str_hash, (GEqualFunc)g_str_equal, g_free, NULL);
|
||||||
goto out;
|
g_autoptr(GHashTable) active_boot_checksums =
|
||||||
}
|
g_hash_table_new_full (g_str_hash, (GEqualFunc)g_str_equal, g_free, NULL);
|
||||||
|
for (guint i = 0; i < self->deployments->len; i++)
|
||||||
active_deployment_dirs = g_hash_table_new_full (g_str_hash, (GEqualFunc)g_str_equal, g_free, NULL);
|
|
||||||
active_boot_checksums = g_hash_table_new_full (g_str_hash, (GEqualFunc)g_str_equal, g_free, NULL);
|
|
||||||
|
|
||||||
for (i = 0; i < self->deployments->len; i++)
|
|
||||||
{
|
{
|
||||||
OstreeDeployment *deployment = self->deployments->pdata[i];
|
OstreeDeployment *deployment = self->deployments->pdata[i];
|
||||||
char *deployment_path = ostree_sysroot_get_deployment_dirpath (self, deployment);
|
char *deployment_path = ostree_sysroot_get_deployment_dirpath (self, deployment);
|
||||||
|
|
@ -277,11 +269,12 @@ cleanup_old_deployments (OstreeSysroot *self,
|
||||||
g_hash_table_replace (active_boot_checksums, bootcsum, bootcsum);
|
g_hash_table_replace (active_boot_checksums, bootcsum, bootcsum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Find all deployment directories, both active and inactive */
|
||||||
|
g_autoptr(GPtrArray) all_deployment_dirs = NULL;
|
||||||
if (!list_all_deployment_directories (self, &all_deployment_dirs,
|
if (!list_all_deployment_directories (self, &all_deployment_dirs,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
for (guint i = 0; i < all_deployment_dirs->len; i++)
|
||||||
for (i = 0; i < all_deployment_dirs->len; i++)
|
|
||||||
{
|
{
|
||||||
OstreeDeployment *deployment = all_deployment_dirs->pdata[i];
|
OstreeDeployment *deployment = all_deployment_dirs->pdata[i];
|
||||||
g_autofree char *deployment_path = ostree_sysroot_get_deployment_dirpath (self, deployment);
|
g_autofree char *deployment_path = ostree_sysroot_get_deployment_dirpath (self, deployment);
|
||||||
|
|
@ -294,13 +287,10 @@ cleanup_old_deployments (OstreeSysroot *self,
|
||||||
|
|
||||||
if (!glnx_opendirat (self->sysroot_fd, deployment_path, TRUE,
|
if (!glnx_opendirat (self->sysroot_fd, deployment_path, TRUE,
|
||||||
&deployment_fd, error))
|
&deployment_fd, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (fstat (deployment_fd, &stbuf) != 0)
|
if (!glnx_fstat (deployment_fd, &stbuf, error))
|
||||||
{
|
return FALSE;
|
||||||
glnx_set_error_from_errno (error);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This shouldn't happen, because higher levels should
|
/* This shouldn't happen, because higher levels should
|
||||||
* disallow having the booted deployment not in the active
|
* disallow having the booted deployment not in the active
|
||||||
|
|
@ -309,22 +299,24 @@ cleanup_old_deployments (OstreeSysroot *self,
|
||||||
stbuf.st_ino == root_stbuf.st_ino)
|
stbuf.st_ino == root_stbuf.st_ino)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
/* This deployment wasn't referenced, so delete it */
|
||||||
if (!_ostree_linuxfs_fd_alter_immutable_flag (deployment_fd, FALSE,
|
if (!_ostree_linuxfs_fd_alter_immutable_flag (deployment_fd, FALSE,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, deployment_path, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, origin_relpath, cancellable, error))
|
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, origin_relpath, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
if (!glnx_shutil_rm_rf_at (self->sysroot_fd, deployment_path, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clean up boot directories */
|
||||||
|
g_autoptr(GPtrArray) all_boot_dirs = NULL;
|
||||||
if (!list_all_boot_directories (self, &all_boot_dirs,
|
if (!list_all_boot_directories (self, &all_boot_dirs,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
for (i = 0; i < all_boot_dirs->len; i++)
|
for (guint i = 0; i < all_boot_dirs->len; i++)
|
||||||
{
|
{
|
||||||
GFile *bootdir = all_boot_dirs->pdata[i];
|
GFile *bootdir = all_boot_dirs->pdata[i];
|
||||||
g_autofree char *osname = NULL;
|
g_autofree char *osname = NULL;
|
||||||
|
|
@ -338,14 +330,13 @@ cleanup_old_deployments (OstreeSysroot *self,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!glnx_shutil_rm_rf_at (AT_FDCWD, gs_file_get_path_cached (bootdir), cancellable, error))
|
if (!glnx_shutil_rm_rf_at (AT_FDCWD, gs_file_get_path_cached (bootdir), cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Delete the ref bindings for a non-active boot version */
|
||||||
static gboolean
|
static gboolean
|
||||||
cleanup_ref_prefix (OstreeRepo *repo,
|
cleanup_ref_prefix (OstreeRepo *repo,
|
||||||
int bootversion,
|
int bootversion,
|
||||||
|
|
@ -353,36 +344,24 @@ cleanup_ref_prefix (OstreeRepo *repo,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
g_autofree char *prefix = g_strdup_printf ("ostree/%d/%d", bootversion, subbootversion);
|
||||||
g_autofree char *prefix = NULL;
|
|
||||||
g_autoptr(GHashTable) refs = NULL;
|
g_autoptr(GHashTable) refs = NULL;
|
||||||
GHashTableIter hashiter;
|
|
||||||
gpointer hashkey, hashvalue;
|
|
||||||
|
|
||||||
prefix = g_strdup_printf ("ostree/%d/%d", bootversion, subbootversion);
|
|
||||||
|
|
||||||
if (!ostree_repo_list_refs_ext (repo, prefix, &refs, OSTREE_REPO_LIST_REFS_EXT_NONE, cancellable, error))
|
if (!ostree_repo_list_refs_ext (repo, prefix, &refs, OSTREE_REPO_LIST_REFS_EXT_NONE, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!ostree_repo_prepare_transaction (repo, NULL, cancellable, error))
|
GLNX_HASH_TABLE_FOREACH (refs, const char *, ref)
|
||||||
goto out;
|
|
||||||
|
|
||||||
g_hash_table_iter_init (&hashiter, refs);
|
|
||||||
while (g_hash_table_iter_next (&hashiter, &hashkey, &hashvalue))
|
|
||||||
{
|
{
|
||||||
const char *ref = hashkey;
|
if (!ostree_repo_set_ref_immediate (repo, NULL, ref, NULL, cancellable, error))
|
||||||
ostree_repo_transaction_set_refspec (repo, ref, NULL);
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ostree_repo_commit_transaction (repo, NULL, cancellable, error))
|
return TRUE;
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
ostree_repo_abort_transaction (repo, cancellable, NULL);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* libostree holds a ref for each deployment's exact checksum to avoid it being
|
||||||
|
* GC'd even if the origin ref changes. This function resets those refs
|
||||||
|
* to match active deployments.
|
||||||
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
generate_deployment_refs (OstreeSysroot *self,
|
generate_deployment_refs (OstreeSysroot *self,
|
||||||
OstreeRepo *repo,
|
OstreeRepo *repo,
|
||||||
|
|
@ -392,46 +371,38 @@ generate_deployment_refs (OstreeSysroot *self,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
int cleanup_bootversion = (bootversion == 0) ? 1 : 0;
|
||||||
int cleanup_bootversion;
|
int cleanup_subbootversion = (subbootversion == 0) ? 1 : 0;
|
||||||
int cleanup_subbootversion;
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
cleanup_bootversion = (bootversion == 0) ? 1 : 0;
|
|
||||||
cleanup_subbootversion = (subbootversion == 0) ? 1 : 0;
|
|
||||||
|
|
||||||
if (!cleanup_ref_prefix (repo, cleanup_bootversion, 0,
|
if (!cleanup_ref_prefix (repo, cleanup_bootversion, 0,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!cleanup_ref_prefix (repo, cleanup_bootversion, 1,
|
if (!cleanup_ref_prefix (repo, cleanup_bootversion, 1,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!cleanup_ref_prefix (repo, bootversion, cleanup_subbootversion,
|
if (!cleanup_ref_prefix (repo, bootversion, cleanup_subbootversion,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
for (i = 0; i < deployments->len; i++)
|
g_autoptr(_OstreeRepoAutoTransaction) txn =
|
||||||
|
_ostree_repo_auto_transaction_start (repo, cancellable, error);
|
||||||
|
if (!txn)
|
||||||
|
return FALSE;
|
||||||
|
for (guint i = 0; i < deployments->len; i++)
|
||||||
{
|
{
|
||||||
OstreeDeployment *deployment = deployments->pdata[i];
|
OstreeDeployment *deployment = deployments->pdata[i];
|
||||||
g_autofree char *refname = g_strdup_printf ("ostree/%d/%d/%u",
|
g_autofree char *refname = g_strdup_printf ("ostree/%d/%d/%u",
|
||||||
bootversion, subbootversion,
|
bootversion, subbootversion,
|
||||||
i);
|
i);
|
||||||
|
|
||||||
if (!ostree_repo_prepare_transaction (repo, NULL, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ostree_repo_transaction_set_refspec (repo, refname, ostree_deployment_get_csum (deployment));
|
ostree_repo_transaction_set_refspec (repo, refname, ostree_deployment_get_csum (deployment));
|
||||||
|
|
||||||
if (!ostree_repo_commit_transaction (repo, NULL, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
if (!ostree_repo_commit_transaction (repo, NULL, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
ostree_repo_abort_transaction (repo, cancellable, NULL);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
@ -442,12 +413,10 @@ prune_repo (OstreeRepo *repo,
|
||||||
gint n_objects_total;
|
gint n_objects_total;
|
||||||
gint n_objects_pruned;
|
gint n_objects_pruned;
|
||||||
guint64 freed_space;
|
guint64 freed_space;
|
||||||
gboolean ret = FALSE;
|
|
||||||
|
|
||||||
if (!ostree_repo_prune (repo, OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY, 0,
|
if (!ostree_repo_prune (repo, OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY, 0,
|
||||||
&n_objects_total, &n_objects_pruned, &freed_space,
|
&n_objects_total, &n_objects_pruned, &freed_space,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (freed_space > 0)
|
if (freed_space > 0)
|
||||||
{
|
{
|
||||||
|
|
@ -455,10 +424,7 @@ prune_repo (OstreeRepo *repo,
|
||||||
g_print ("Freed objects: %s\n", freed_space_str);
|
g_print ("Freed objects: %s\n", freed_space_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -171,8 +171,8 @@ copy_dir_recurse (int src_parent_dfd,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Create with mode 0700, we'll fchmod/fchown later */
|
/* Create with mode 0700, we'll fchmod/fchown later */
|
||||||
if (mkdirat (dest_parent_dfd, name, 0700) != 0)
|
if (!glnx_ensure_dir (dest_parent_dfd, name, 0700, error))
|
||||||
return glnx_throw_errno (error);
|
return FALSE;
|
||||||
|
|
||||||
if (!glnx_opendirat (dest_parent_dfd, name, TRUE, &dest_dfd, error))
|
if (!glnx_opendirat (dest_parent_dfd, name, TRUE, &dest_dfd, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
@ -882,46 +882,187 @@ ostree_sysroot_write_origin_file (OstreeSysroot *sysroot,
|
||||||
cancellable, error);
|
cancellable, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Originally OSTree defined kernels to be found underneath /boot
|
typedef struct {
|
||||||
* in the tree. But that means when mounting /boot at runtime
|
int boot_dfd;
|
||||||
* we end up masking the content underneath, triggering a warning.
|
char *kernel_srcpath;
|
||||||
*
|
char *kernel_namever;
|
||||||
* For that reason, and also consistency with the "/usr defines the OS" model we
|
char *initramfs_srcpath;
|
||||||
* later switched to defining the in-tree kernels to be found under
|
char *initramfs_namever;
|
||||||
* /usr/lib/ostree-boot.
|
char *bootcsum;
|
||||||
*/
|
} OstreeKernelLayout;
|
||||||
|
static void
|
||||||
|
_ostree_kernel_layout_free (OstreeKernelLayout *layout)
|
||||||
|
{
|
||||||
|
if (layout->boot_dfd != -1)
|
||||||
|
(void) close (layout->boot_dfd);
|
||||||
|
g_free (layout->kernel_srcpath);
|
||||||
|
g_free (layout->kernel_namever);
|
||||||
|
g_free (layout->initramfs_srcpath);
|
||||||
|
g_free (layout->initramfs_namever);
|
||||||
|
g_free (layout->bootcsum);
|
||||||
|
g_free (layout);
|
||||||
|
}
|
||||||
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC(OstreeKernelLayout, _ostree_kernel_layout_free);
|
||||||
|
|
||||||
|
static OstreeKernelLayout*
|
||||||
|
_ostree_kernel_layout_new (void)
|
||||||
|
{
|
||||||
|
OstreeKernelLayout *ret = g_new0 (OstreeKernelLayout, 1);
|
||||||
|
ret->boot_dfd = -1;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See get_kernel_from_tree() below */
|
||||||
static gboolean
|
static gboolean
|
||||||
get_kernel_from_tree (int deployment_dfd,
|
get_kernel_from_tree_usrlib_modules (int deployment_dfd,
|
||||||
int *out_boot_dfd,
|
OstreeKernelLayout **out_layout,
|
||||||
char **out_kernel_srcpath,
|
|
||||||
char **out_kernel_namever,
|
|
||||||
char **out_initramfs_srcpath,
|
|
||||||
char **out_initramfs_namever,
|
|
||||||
char **out_bootcsum,
|
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
g_autofree char *ret_kernel_srcpath = NULL;
|
g_autofree char *kver = NULL;
|
||||||
g_autofree char *ret_kernel_namever = NULL;
|
/* Look in usr/lib/modules */
|
||||||
g_autofree char *ret_initramfs_srcpath = NULL;
|
g_auto(GLnxDirFdIterator) mod_dfditer = { 0, };
|
||||||
g_autofree char *ret_initramfs_namever = NULL;
|
gboolean exists;
|
||||||
g_autofree char *kernel_checksum = NULL;
|
if (!ot_dfd_iter_init_allow_noent (deployment_dfd, "usr/lib/modules", &mod_dfditer,
|
||||||
g_autofree char *initramfs_checksum = NULL;
|
&exists, error))
|
||||||
|
return FALSE;
|
||||||
|
if (!exists)
|
||||||
|
{
|
||||||
|
/* No usr/lib/modules? We're done */
|
||||||
|
*out_layout = NULL;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
glnx_fd_close int ret_boot_dfd = glnx_opendirat_with_errno (deployment_dfd, "usr/lib/ostree-boot", TRUE);
|
g_autoptr(OstreeKernelLayout) ret_layout = _ostree_kernel_layout_new ();
|
||||||
if (ret_boot_dfd == -1)
|
|
||||||
|
/* Reusable buffer for path string */
|
||||||
|
g_autoptr(GString) pathbuf = g_string_new ("");
|
||||||
|
/* Loop until we find something that looks like a valid /usr/lib/modules/$kver */
|
||||||
|
while (ret_layout->boot_dfd == -1)
|
||||||
|
{
|
||||||
|
struct dirent *dent;
|
||||||
|
struct stat stbuf;
|
||||||
|
|
||||||
|
if (!glnx_dirfd_iterator_next_dent_ensure_dtype (&mod_dfditer, &dent, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
if (dent == NULL)
|
||||||
|
break;
|
||||||
|
if (dent->d_type != DT_DIR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* It's a directory, look for /vmlinuz as a regular file */
|
||||||
|
g_string_truncate (pathbuf, 0);
|
||||||
|
g_string_append_printf (pathbuf, "%s/vmlinuz", dent->d_name);
|
||||||
|
if (fstatat (mod_dfditer.fd, pathbuf->str, &stbuf, 0) < 0)
|
||||||
{
|
{
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
return glnx_throw_errno_prefix (error, "%s", "openat(usr/lib/ostree-boot)");
|
return glnx_throw_errno_prefix (error, "fstatat(%s)", pathbuf->str);
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!glnx_opendirat (deployment_dfd, "boot", TRUE, &ret_boot_dfd, error))
|
/* Not a regular file? Loop again */
|
||||||
return FALSE;
|
if (!S_ISREG (stbuf.st_mode))
|
||||||
}
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Looks valid, this should exit the loop */
|
||||||
|
if (!glnx_opendirat (mod_dfditer.fd, dent->d_name, FALSE, &ret_layout->boot_dfd, error))
|
||||||
|
return FALSE;
|
||||||
|
kver = g_strdup (dent->d_name);
|
||||||
|
ret_layout->kernel_srcpath = g_strdup ("vmlinuz");
|
||||||
|
ret_layout->kernel_namever = g_strdup_printf ("vmlinuz-%s", kver);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret_layout->boot_dfd == -1)
|
||||||
|
{
|
||||||
|
*out_layout = NULL;
|
||||||
|
/* No kernel found? We're done. */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We found a module directory, compute the checksum */
|
||||||
|
g_autoptr(GChecksum) checksum = g_checksum_new (G_CHECKSUM_SHA256);
|
||||||
|
glnx_fd_close int fd = -1;
|
||||||
|
/* Checksum the kernel */
|
||||||
|
if (!glnx_openat_rdonly (ret_layout->boot_dfd, "vmlinuz", TRUE, &fd, error))
|
||||||
|
return FALSE;
|
||||||
|
g_autoptr(GInputStream) in = g_unix_input_stream_new (fd, FALSE);
|
||||||
|
if (!ot_gio_splice_update_checksum (NULL, in, checksum, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
g_clear_object (&in);
|
||||||
|
(void) close (fd); fd = -1;
|
||||||
|
|
||||||
|
/* Look for an initramfs, but it's optional; since there wasn't any precedent
|
||||||
|
* for this, let's be a bit conservative and support both `initramfs.img` and
|
||||||
|
* `initramfs`.
|
||||||
|
*/
|
||||||
|
const char *initramfs_paths[] = {"initramfs.img", "initramfs"};
|
||||||
|
const char *initramfs_path = NULL;
|
||||||
|
for (guint i = 0; i < G_N_ELEMENTS(initramfs_paths); i++)
|
||||||
|
{
|
||||||
|
initramfs_path = initramfs_paths[i];
|
||||||
|
if (!ot_openat_ignore_enoent (ret_layout->boot_dfd, initramfs_path, &fd, error))
|
||||||
|
return FALSE;
|
||||||
|
if (fd != -1)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
initramfs_path = NULL;
|
||||||
|
}
|
||||||
|
if (fd != -1)
|
||||||
|
{
|
||||||
|
g_assert (initramfs_path);
|
||||||
|
ret_layout->initramfs_srcpath = g_strdup (initramfs_path);
|
||||||
|
ret_layout->initramfs_namever = g_strdup_printf ("initramfs-%s.img", kver);
|
||||||
|
in = g_unix_input_stream_new (fd, FALSE);
|
||||||
|
if (!ot_gio_splice_update_checksum (NULL, in, checksum, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret_layout->bootcsum = g_strdup (g_checksum_get_string (checksum));
|
||||||
|
|
||||||
|
*out_layout = g_steal_pointer (&ret_layout);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See get_kernel_from_tree() below */
|
||||||
|
static gboolean
|
||||||
|
get_kernel_from_tree_legacy_layouts (int deployment_dfd,
|
||||||
|
OstreeKernelLayout **out_layout,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
const char *legacy_paths[] = {"usr/lib/ostree-boot", "boot"};
|
||||||
|
g_autofree char *kernel_checksum = NULL;
|
||||||
|
g_autofree char *initramfs_checksum = NULL;
|
||||||
|
g_autoptr(OstreeKernelLayout) ret_layout = _ostree_kernel_layout_new ();
|
||||||
|
|
||||||
|
for (guint i = 0; i < G_N_ELEMENTS (legacy_paths); i++)
|
||||||
|
{
|
||||||
|
const char *path = legacy_paths[i];
|
||||||
|
ret_layout->boot_dfd = glnx_opendirat_with_errno (deployment_dfd, path, TRUE);
|
||||||
|
if (ret_layout->boot_dfd == -1)
|
||||||
|
{
|
||||||
|
if (errno != ENOENT)
|
||||||
|
return glnx_throw_errno_prefix (error, "openat(%s)", path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret_layout->boot_dfd == -1)
|
||||||
|
{
|
||||||
|
/* No legacy found? We're done */
|
||||||
|
*out_layout = NULL;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ret_layout->boot_dfd will point to either /usr/lib/ostree-boot or /boot, let's
|
||||||
|
* inspect it.
|
||||||
|
*/
|
||||||
g_auto(GLnxDirFdIterator) dfditer = { 0, };
|
g_auto(GLnxDirFdIterator) dfditer = { 0, };
|
||||||
if (!glnx_dirfd_iterator_init_at (ret_boot_dfd, ".", FALSE, &dfditer, error))
|
if (!glnx_dirfd_iterator_init_at (ret_layout->boot_dfd, ".", FALSE, &dfditer, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
|
|
@ -930,64 +1071,146 @@ get_kernel_from_tree (int deployment_dfd,
|
||||||
|
|
||||||
if (!glnx_dirfd_iterator_next_dent (&dfditer, &dent, cancellable, error))
|
if (!glnx_dirfd_iterator_next_dent (&dfditer, &dent, cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (dent == NULL)
|
if (dent == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
const char *name = dent->d_name;
|
const char *name = dent->d_name;
|
||||||
if (ret_kernel_srcpath == NULL && g_str_has_prefix (name, "vmlinuz-"))
|
/* See if this is the kernel */
|
||||||
|
if (ret_layout->kernel_srcpath == NULL && g_str_has_prefix (name, "vmlinuz-"))
|
||||||
{
|
{
|
||||||
const char *dash = strrchr (name, '-');
|
const char *dash = strrchr (name, '-');
|
||||||
g_assert (dash);
|
g_assert (dash);
|
||||||
|
/* In this version, we require that the tree builder generated a
|
||||||
|
* sha256 of the kernel+initramfs and appended it to the file names.
|
||||||
|
*/
|
||||||
if (ostree_validate_structureof_checksum_string (dash + 1, NULL))
|
if (ostree_validate_structureof_checksum_string (dash + 1, NULL))
|
||||||
{
|
{
|
||||||
kernel_checksum = g_strdup (dash + 1);
|
kernel_checksum = g_strdup (dash + 1);
|
||||||
ret_kernel_srcpath = g_strdup (name);
|
ret_layout->kernel_srcpath = g_strdup (name);
|
||||||
ret_kernel_namever = g_strndup (name, dash - name);
|
ret_layout->kernel_namever = g_strndup (name, dash - name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ret_initramfs_srcpath == NULL && g_str_has_prefix (name, "initramfs-"))
|
/* See if this is the initramfs */
|
||||||
|
else if (ret_layout->initramfs_srcpath == NULL && g_str_has_prefix (name, "initramfs-"))
|
||||||
{
|
{
|
||||||
const char *dash = strrchr (name, '-');
|
const char *dash = strrchr (name, '-');
|
||||||
g_assert (dash);
|
g_assert (dash);
|
||||||
if (ostree_validate_structureof_checksum_string (dash + 1, NULL))
|
if (ostree_validate_structureof_checksum_string (dash + 1, NULL))
|
||||||
{
|
{
|
||||||
initramfs_checksum = g_strdup (dash + 1);
|
initramfs_checksum = g_strdup (dash + 1);
|
||||||
ret_initramfs_srcpath = g_strdup (name);
|
ret_layout->initramfs_srcpath = g_strdup (name);
|
||||||
ret_initramfs_namever = g_strndup (name, dash - name);
|
ret_layout->initramfs_namever = g_strndup (name, dash - name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret_kernel_srcpath != NULL && ret_initramfs_srcpath != NULL)
|
/* If we found both a kernel and initramfs, break out of the loop */
|
||||||
|
if (ret_layout->kernel_srcpath != NULL && ret_layout->initramfs_srcpath != NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret_kernel_srcpath == NULL)
|
/* No kernel found? We're done */
|
||||||
|
if (ret_layout->kernel_srcpath == NULL)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
|
*out_layout = NULL;
|
||||||
"Failed to find kernel in /usr/lib/ostree-boot or /boot");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret_initramfs_srcpath != NULL)
|
|
||||||
{
|
|
||||||
if (strcmp (kernel_checksum, initramfs_checksum) != 0)
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
|
|
||||||
"Mismatched kernel checksum vs initrd");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*out_boot_dfd = glnx_steal_fd (&ret_boot_dfd);
|
|
||||||
*out_kernel_srcpath = g_steal_pointer (&ret_kernel_srcpath);
|
|
||||||
*out_kernel_namever = g_steal_pointer (&ret_kernel_namever);
|
|
||||||
*out_initramfs_srcpath = g_steal_pointer (&ret_initramfs_srcpath);
|
|
||||||
*out_initramfs_namever = g_steal_pointer (&ret_initramfs_namever);
|
|
||||||
*out_bootcsum = g_steal_pointer (&kernel_checksum);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The kernel/initramfs checksums must be the same */
|
||||||
|
if (ret_layout->initramfs_srcpath != NULL)
|
||||||
|
{
|
||||||
|
g_assert (kernel_checksum != NULL);
|
||||||
|
g_assert (initramfs_checksum != NULL);
|
||||||
|
if (strcmp (kernel_checksum, initramfs_checksum) != 0)
|
||||||
|
return glnx_throw (error, "Mismatched kernel checksum vs initrd");
|
||||||
|
}
|
||||||
|
|
||||||
|
ret_layout->bootcsum = g_steal_pointer (&kernel_checksum);
|
||||||
|
|
||||||
|
*out_layout = g_steal_pointer (&ret_layout);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Locate kernel/initramfs in the tree; the current standard is to look in
|
||||||
|
* /usr/lib/modules/$kver/vmlinuz first.
|
||||||
|
*
|
||||||
|
* Originally OSTree defined kernels to be found underneath /boot
|
||||||
|
* in the tree. But that means when mounting /boot at runtime
|
||||||
|
* we end up masking the content underneath, triggering a warning.
|
||||||
|
*
|
||||||
|
* For that reason, and also consistency with the "/usr defines the OS" model we
|
||||||
|
* later switched to defining the in-tree kernels to be found under
|
||||||
|
* /usr/lib/ostree-boot. But since then, Fedora at least switched to storing the
|
||||||
|
* kernel in /usr/lib/modules, which makes sense and isn't ostree-specific, so
|
||||||
|
* we prefer that now. However, the default Fedora layout doesn't put the
|
||||||
|
* initramfs there, so we need to look in /usr/lib/ostree-boot first.
|
||||||
|
*/
|
||||||
|
static gboolean
|
||||||
|
get_kernel_from_tree (int deployment_dfd,
|
||||||
|
OstreeKernelLayout **out_layout,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
g_autoptr(OstreeKernelLayout) usrlib_modules_layout = NULL;
|
||||||
|
g_autoptr(OstreeKernelLayout) legacy_layout = NULL;
|
||||||
|
|
||||||
|
/* First, gather from usr/lib/modules/$kver if it exists */
|
||||||
|
if (!get_kernel_from_tree_usrlib_modules (deployment_dfd, &usrlib_modules_layout, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* Gather the legacy layout */
|
||||||
|
if (!get_kernel_from_tree_legacy_layouts (deployment_dfd, &legacy_layout, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* Evaluate the state of both layouts. If there's no legacy layout
|
||||||
|
* If a legacy layout exists, and it has
|
||||||
|
* an initramfs but the module layout doesn't, the legacy layout wins. This is
|
||||||
|
* what happens with rpm-ostree with Fedora today, until rpm-ostree learns the
|
||||||
|
* new layout.
|
||||||
|
*/
|
||||||
|
if (legacy_layout == NULL)
|
||||||
|
{
|
||||||
|
/* No legacy layout, let's see if we have a module layout...*/
|
||||||
|
if (usrlib_modules_layout == NULL)
|
||||||
|
{
|
||||||
|
/* Both layouts are not found? Throw. */
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
|
||||||
|
"Failed to find kernel in /usr/lib/modules, /usr/lib/ostree-boot or /boot");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No legacy, just usr/lib/modules? We're done */
|
||||||
|
*out_layout = g_steal_pointer (&usrlib_modules_layout);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (usrlib_modules_layout != NULL &&
|
||||||
|
usrlib_modules_layout->initramfs_srcpath == NULL &&
|
||||||
|
legacy_layout->initramfs_srcpath != NULL)
|
||||||
|
{
|
||||||
|
/* Does the module path not have an initramfs, but the legacy does? Prefer
|
||||||
|
* the latter then, to make rpm-ostree work as is today.
|
||||||
|
*/
|
||||||
|
*out_layout = g_steal_pointer (&legacy_layout);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
/* Prefer module layout */
|
||||||
|
else if (usrlib_modules_layout != NULL)
|
||||||
|
{
|
||||||
|
*out_layout = g_steal_pointer (&usrlib_modules_layout);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* And finally fall back to legacy; we know one exists since we
|
||||||
|
* checked first above.
|
||||||
|
*/
|
||||||
|
g_assert (legacy_layout->kernel_srcpath);
|
||||||
|
*out_layout = g_steal_pointer (&legacy_layout);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* We used to syncfs(), but that doesn't flush the journal on XFS,
|
/* We used to syncfs(), but that doesn't flush the journal on XFS,
|
||||||
* and since GRUB2 can't read the XFS journal, the system
|
* and since GRUB2 can't read the XFS journal, the system
|
||||||
* could fail to boot.
|
* could fail to boot.
|
||||||
|
|
@ -1315,18 +1538,8 @@ install_deployment_kernel (OstreeSysroot *sysroot,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Find the kernel/initramfs in the tree */
|
/* Find the kernel/initramfs in the tree */
|
||||||
glnx_fd_close int tree_boot_dfd = -1;
|
g_autoptr(OstreeKernelLayout) kernel_layout = NULL;
|
||||||
g_autofree char *tree_kernel_srcpath = NULL;
|
if (!get_kernel_from_tree (deployment_dfd, &kernel_layout,
|
||||||
g_autofree char *tree_kernel_namever = NULL;
|
|
||||||
g_autofree char *tree_initramfs_srcpath = NULL;
|
|
||||||
g_autofree char *tree_initramfs_namever = NULL;
|
|
||||||
g_autofree char *tree_bootcsum = NULL;
|
|
||||||
if (!get_kernel_from_tree (deployment_dfd, &tree_boot_dfd,
|
|
||||||
&tree_kernel_srcpath,
|
|
||||||
&tree_kernel_namever,
|
|
||||||
&tree_initramfs_srcpath,
|
|
||||||
&tree_initramfs_namever,
|
|
||||||
&tree_bootcsum,
|
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
@ -1336,7 +1549,7 @@ install_deployment_kernel (OstreeSysroot *sysroot,
|
||||||
|
|
||||||
const char *osname = ostree_deployment_get_osname (deployment);
|
const char *osname = ostree_deployment_get_osname (deployment);
|
||||||
const char *bootcsum = ostree_deployment_get_bootcsum (deployment);
|
const char *bootcsum = ostree_deployment_get_bootcsum (deployment);
|
||||||
g_assert_cmpstr (bootcsum, ==, tree_bootcsum);
|
g_assert_cmpstr (kernel_layout->bootcsum, ==, bootcsum);
|
||||||
g_autofree char *bootcsumdir = g_strdup_printf ("ostree/%s-%s", osname, bootcsum);
|
g_autofree char *bootcsumdir = g_strdup_printf ("ostree/%s-%s", osname, bootcsum);
|
||||||
g_autofree char *bootconfdir = g_strdup_printf ("loader.%d/entries", new_bootversion);
|
g_autofree char *bootconfdir = g_strdup_printf ("loader.%d/entries", new_bootversion);
|
||||||
g_autofree char *bootconf_name = g_strdup_printf ("ostree-%s-%d.conf", osname,
|
g_autofree char *bootconf_name = g_strdup_printf ("ostree-%s-%d.conf", osname,
|
||||||
|
|
@ -1355,12 +1568,13 @@ install_deployment_kernel (OstreeSysroot *sysroot,
|
||||||
* it doesn't exist already.
|
* it doesn't exist already.
|
||||||
*/
|
*/
|
||||||
struct stat stbuf;
|
struct stat stbuf;
|
||||||
if (fstatat (bootcsum_dfd, tree_kernel_namever, &stbuf, 0) != 0)
|
if (fstatat (bootcsum_dfd, kernel_layout->kernel_namever, &stbuf, 0) != 0)
|
||||||
{
|
{
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
return glnx_throw_errno_prefix (error, "fstat %s", tree_kernel_namever);
|
return glnx_throw_errno_prefix (error, "fstat %s", kernel_layout->kernel_namever);
|
||||||
if (!hardlink_or_copy_at (tree_boot_dfd, tree_kernel_srcpath,
|
if (!hardlink_or_copy_at (kernel_layout->boot_dfd,
|
||||||
bootcsum_dfd, tree_kernel_namever,
|
kernel_layout->kernel_srcpath,
|
||||||
|
bootcsum_dfd, kernel_layout->kernel_namever,
|
||||||
sysroot->debug_flags,
|
sysroot->debug_flags,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
@ -1369,15 +1583,15 @@ install_deployment_kernel (OstreeSysroot *sysroot,
|
||||||
/* If we have an initramfs, then install it into
|
/* If we have an initramfs, then install it into
|
||||||
* /boot/ostree/osname-${bootcsum} if it doesn't exist already.
|
* /boot/ostree/osname-${bootcsum} if it doesn't exist already.
|
||||||
*/
|
*/
|
||||||
if (tree_initramfs_srcpath)
|
if (kernel_layout->initramfs_srcpath)
|
||||||
{
|
{
|
||||||
g_assert (tree_initramfs_namever);
|
g_assert (kernel_layout->initramfs_namever);
|
||||||
if (fstatat (bootcsum_dfd, tree_initramfs_namever, &stbuf, 0) != 0)
|
if (fstatat (bootcsum_dfd, kernel_layout->initramfs_namever, &stbuf, 0) != 0)
|
||||||
{
|
{
|
||||||
if (errno != ENOENT)
|
if (errno != ENOENT)
|
||||||
return glnx_throw_errno_prefix (error, "fstat %s", tree_initramfs_namever);
|
return glnx_throw_errno_prefix (error, "fstat %s", kernel_layout->initramfs_namever);
|
||||||
if (!hardlink_or_copy_at (tree_boot_dfd, tree_initramfs_srcpath,
|
if (!hardlink_or_copy_at (kernel_layout->boot_dfd, kernel_layout->initramfs_srcpath,
|
||||||
bootcsum_dfd, tree_initramfs_namever,
|
bootcsum_dfd, kernel_layout->initramfs_namever,
|
||||||
sysroot->debug_flags,
|
sysroot->debug_flags,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
@ -1458,12 +1672,12 @@ install_deployment_kernel (OstreeSysroot *sysroot,
|
||||||
|
|
||||||
g_autofree char *version_key = g_strdup_printf ("%d", n_deployments - ostree_deployment_get_index (deployment));
|
g_autofree char *version_key = g_strdup_printf ("%d", n_deployments - ostree_deployment_get_index (deployment));
|
||||||
ostree_bootconfig_parser_set (bootconfig, OSTREE_COMMIT_META_KEY_VERSION, version_key);
|
ostree_bootconfig_parser_set (bootconfig, OSTREE_COMMIT_META_KEY_VERSION, version_key);
|
||||||
g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", tree_kernel_namever, NULL);
|
g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->kernel_namever, NULL);
|
||||||
ostree_bootconfig_parser_set (bootconfig, "linux", boot_relpath);
|
ostree_bootconfig_parser_set (bootconfig, "linux", boot_relpath);
|
||||||
|
|
||||||
if (tree_initramfs_namever)
|
if (kernel_layout->initramfs_namever)
|
||||||
{
|
{
|
||||||
g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", tree_initramfs_namever, NULL);
|
g_autofree char * boot_relpath = g_strconcat ("/", bootcsumdir, "/", kernel_layout->initramfs_namever, NULL);
|
||||||
ostree_bootconfig_parser_set (bootconfig, "initrd", boot_relpath);
|
ostree_bootconfig_parser_set (bootconfig, "initrd", boot_relpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2084,22 +2298,12 @@ ostree_sysroot_deploy_tree (OstreeSysroot *self,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
glnx_fd_close int tree_boot_dfd = -1;
|
g_autoptr(OstreeKernelLayout) kernel_layout = NULL;
|
||||||
g_autofree char *tree_kernel_srcpath = NULL;
|
if (!get_kernel_from_tree (deployment_dfd, &kernel_layout,
|
||||||
g_autofree char *tree_kernel_namever = NULL;
|
|
||||||
g_autofree char *tree_initramfs_srcpath = NULL;
|
|
||||||
g_autofree char *tree_initramfs_namever = NULL;
|
|
||||||
g_autofree char *tree_bootcsum = NULL;
|
|
||||||
if (!get_kernel_from_tree (deployment_dfd, &tree_boot_dfd,
|
|
||||||
&tree_kernel_srcpath,
|
|
||||||
&tree_kernel_namever,
|
|
||||||
&tree_initramfs_srcpath,
|
|
||||||
&tree_initramfs_namever,
|
|
||||||
&new_bootcsum,
|
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
_ostree_deployment_set_bootcsum (new_deployment, new_bootcsum);
|
_ostree_deployment_set_bootcsum (new_deployment, kernel_layout->bootcsum);
|
||||||
|
|
||||||
/* Create an empty boot configuration; we will merge things into
|
/* Create an empty boot configuration; we will merge things into
|
||||||
* it as we go.
|
* it as we go.
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
#include "ostree-sysroot-upgrader.h"
|
#include "ostree-sysroot-upgrader.h"
|
||||||
|
#include "ostree-core-private.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:ostree-sysroot-upgrader
|
* SECTION:ostree-sysroot-upgrader
|
||||||
|
|
@ -429,26 +430,10 @@ ostree_sysroot_upgrader_check_timestamps (OstreeRepo *repo,
|
||||||
error))
|
error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (ostree_commit_get_timestamp (old_commit) > ostree_commit_get_timestamp (new_commit))
|
if (!_ostree_compare_timestamps (from_rev, ostree_commit_get_timestamp (old_commit),
|
||||||
{
|
|
||||||
GDateTime *old_ts = g_date_time_new_from_unix_utc (ostree_commit_get_timestamp (old_commit));
|
|
||||||
GDateTime *new_ts = g_date_time_new_from_unix_utc (ostree_commit_get_timestamp (new_commit));
|
|
||||||
g_autofree char *old_ts_str = NULL;
|
|
||||||
g_autofree char *new_ts_str = NULL;
|
|
||||||
|
|
||||||
if (old_ts == NULL || new_ts == NULL)
|
|
||||||
return glnx_throw (error, "Upgrade target revision '%s' timestamp (%" G_GINT64_FORMAT ") or current revision '%s' timestamp (%" G_GINT64_FORMAT ") is invalid",
|
|
||||||
to_rev, ostree_commit_get_timestamp (new_commit),
|
to_rev, ostree_commit_get_timestamp (new_commit),
|
||||||
from_rev, ostree_commit_get_timestamp (old_commit));
|
error))
|
||||||
|
return FALSE;
|
||||||
old_ts_str = g_date_time_format (old_ts, "%c");
|
|
||||||
new_ts_str = g_date_time_format (new_ts, "%c");
|
|
||||||
g_date_time_unref (old_ts);
|
|
||||||
g_date_time_unref (new_ts);
|
|
||||||
|
|
||||||
return glnx_throw (error, "Upgrade target revision '%s' with timestamp '%s' is chronologically older than current revision '%s' with timestamp '%s'; use --allow-downgrade to permit",
|
|
||||||
to_rev, new_ts_str, from_rev, old_ts_str);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
@ -536,8 +521,22 @@ ostree_sysroot_upgrader_pull_one_dir (OstreeSysrootUpgrader *self,
|
||||||
if (self->origin_remote &&
|
if (self->origin_remote &&
|
||||||
(upgrader_flags & OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_SYNTHETIC) == 0)
|
(upgrader_flags & OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_SYNTHETIC) == 0)
|
||||||
{
|
{
|
||||||
if (!ostree_repo_pull_one_dir (repo, self->origin_remote, dir_to_pull, refs_to_fetch,
|
g_autoptr(GVariantBuilder) optbuilder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
|
||||||
flags, progress,
|
if (dir_to_pull && *dir_to_pull)
|
||||||
|
g_variant_builder_add (optbuilder, "{s@v}", "subdir",
|
||||||
|
g_variant_new_variant (g_variant_new_string (dir_to_pull)));
|
||||||
|
g_variant_builder_add (optbuilder, "{s@v}", "flags",
|
||||||
|
g_variant_new_variant (g_variant_new_int32 (flags)));
|
||||||
|
/* Add the timestamp check, unless disabled */
|
||||||
|
if ((upgrader_flags & OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_ALLOW_OLDER) == 0)
|
||||||
|
g_variant_builder_add (optbuilder, "{s@v}", "timestamp-check",
|
||||||
|
g_variant_new_variant (g_variant_new_boolean (TRUE)));
|
||||||
|
|
||||||
|
g_variant_builder_add (optbuilder, "{s@v}", "refs",
|
||||||
|
g_variant_new_variant (g_variant_new_strv ((const char *const*) refs_to_fetch, -1)));
|
||||||
|
g_autoptr(GVariant) opts = g_variant_ref_sink (g_variant_builder_end (optbuilder));
|
||||||
|
if (!ostree_repo_pull_with_options (repo, self->origin_remote,
|
||||||
|
opts, progress,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -471,8 +471,8 @@ _ostree_sysroot_read_boot_loader_configs (OstreeSysroot *self,
|
||||||
if (dent == NULL)
|
if (dent == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (fstatat (dfd_iter.fd, dent->d_name, &stbuf, 0) != 0)
|
if (!glnx_fstatat (dfd_iter.fd, dent->d_name, &stbuf, 0, error))
|
||||||
return glnx_throw_errno (error);
|
return FALSE;
|
||||||
|
|
||||||
if (g_str_has_prefix (dent->d_name, "ostree-") &&
|
if (g_str_has_prefix (dent->d_name, "ostree-") &&
|
||||||
g_str_has_suffix (dent->d_name, ".conf") &&
|
g_str_has_suffix (dent->d_name, ".conf") &&
|
||||||
|
|
@ -772,6 +772,13 @@ ensure_repo (OstreeSysroot *self,
|
||||||
*/
|
*/
|
||||||
g_weak_ref_init (&self->repo->sysroot, self);
|
g_weak_ref_init (&self->repo->sysroot, self);
|
||||||
self->repo->sysroot_kind = OSTREE_REPO_SYSROOT_KIND_VIA_SYSROOT;
|
self->repo->sysroot_kind = OSTREE_REPO_SYSROOT_KIND_VIA_SYSROOT;
|
||||||
|
|
||||||
|
/* Reload the repo config in case any defaults depend on knowing if this is
|
||||||
|
* a system repo.
|
||||||
|
*/
|
||||||
|
if (!ostree_repo_reload_config (self->repo, NULL, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1487,6 +1494,12 @@ ostree_sysroot_init_osname (OstreeSysroot *self,
|
||||||
* If %OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN is
|
* If %OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN is
|
||||||
* specified, then all current deployments will be kept.
|
* specified, then all current deployments will be kept.
|
||||||
*
|
*
|
||||||
|
* If %OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_PENDING is
|
||||||
|
* specified, then pending deployments will be kept.
|
||||||
|
*
|
||||||
|
* If %OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_ROLLBACK is
|
||||||
|
* specified, then rollback deployments will be kept.
|
||||||
|
*
|
||||||
* If %OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT is
|
* If %OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT is
|
||||||
* specified, then instead of prepending, the new deployment will be
|
* specified, then instead of prepending, the new deployment will be
|
||||||
* added right after the booted or merge deployment, instead of first.
|
* added right after the booted or merge deployment, instead of first.
|
||||||
|
|
@ -1505,70 +1518,91 @@ ostree_sysroot_simple_write_deployment (OstreeSysroot *sysroot,
|
||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
const gboolean postclean =
|
||||||
guint i;
|
(flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NO_CLEAN) == 0;
|
||||||
OstreeDeployment *booted_deployment = NULL;
|
const gboolean make_default =
|
||||||
g_autoptr(GPtrArray) deployments = NULL;
|
!((flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT) > 0);
|
||||||
g_autoptr(GPtrArray) new_deployments = g_ptr_array_new_with_free_func (g_object_unref);
|
const gboolean retain_pending =
|
||||||
const gboolean postclean = (flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NO_CLEAN) == 0;
|
(flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_PENDING) > 0;
|
||||||
OstreeSysrootWriteDeploymentsOpts write_opts = { .do_postclean = postclean };
|
const gboolean retain_rollback =
|
||||||
gboolean retain = (flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN) > 0;
|
(flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_ROLLBACK) > 0;
|
||||||
const gboolean make_default = !((flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT) > 0);
|
gboolean retain =
|
||||||
gboolean added_new = FALSE;
|
(flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN) > 0;
|
||||||
|
|
||||||
deployments = ostree_sysroot_get_deployments (sysroot);
|
g_autoptr(GPtrArray) deployments = ostree_sysroot_get_deployments (sysroot);
|
||||||
booted_deployment = ostree_sysroot_get_booted_deployment (sysroot);
|
OstreeDeployment *booted_deployment = ostree_sysroot_get_booted_deployment (sysroot);
|
||||||
|
|
||||||
if (osname == NULL && booted_deployment)
|
if (osname == NULL && booted_deployment)
|
||||||
osname = ostree_deployment_get_osname (booted_deployment);
|
osname = ostree_deployment_get_osname (booted_deployment);
|
||||||
|
|
||||||
|
gboolean added_new = FALSE;
|
||||||
|
g_autoptr(GPtrArray) new_deployments = g_ptr_array_new_with_free_func (g_object_unref);
|
||||||
if (make_default)
|
if (make_default)
|
||||||
{
|
{
|
||||||
g_ptr_array_add (new_deployments, g_object_ref (new_deployment));
|
g_ptr_array_add (new_deployments, g_object_ref (new_deployment));
|
||||||
added_new = TRUE;
|
added_new = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < deployments->len; i++)
|
/* without a booted and a merge deployment, retain_pending/rollback become meaningless;
|
||||||
|
* let's just retain all deployments in that case */
|
||||||
|
if (!booted_deployment && !merge_deployment && (retain_pending || retain_rollback))
|
||||||
|
retain = TRUE;
|
||||||
|
|
||||||
|
/* tracks when we come across the booted deployment */
|
||||||
|
gboolean before_booted = TRUE;
|
||||||
|
gboolean before_merge = TRUE;
|
||||||
|
for (guint i = 0; i < deployments->len; i++)
|
||||||
{
|
{
|
||||||
OstreeDeployment *deployment = deployments->pdata[i];
|
OstreeDeployment *deployment = deployments->pdata[i];
|
||||||
const gboolean is_merge_or_booted =
|
const gboolean osname_matches =
|
||||||
ostree_deployment_equal (deployment, booted_deployment) ||
|
(osname == NULL || g_str_equal (ostree_deployment_get_osname (deployment), osname));
|
||||||
ostree_deployment_equal (deployment, merge_deployment);
|
const gboolean is_booted = ostree_deployment_equal (deployment, booted_deployment);
|
||||||
|
const gboolean is_merge = ostree_deployment_equal (deployment, merge_deployment);
|
||||||
|
|
||||||
/* Keep deployments with different osnames, as well as the
|
if (is_booted)
|
||||||
* booted and merge deployments
|
before_booted = FALSE;
|
||||||
|
if (is_merge)
|
||||||
|
before_merge = FALSE;
|
||||||
|
|
||||||
|
/* use the booted deployment as the "crossover" point between pending and rollback
|
||||||
|
* deployments, fall back on merge deployment */
|
||||||
|
const gboolean passed_crossover = booted_deployment ? !before_booted : !before_merge;
|
||||||
|
|
||||||
|
/* Retain deployment if:
|
||||||
|
* - we're explicitly asked to, or
|
||||||
|
* - the deployment is for another osname, or
|
||||||
|
* - we're keeping pending deployments and this is a pending deployment, or
|
||||||
|
* - this is the merge or boot deployment, or
|
||||||
|
* - we're keeping rollback deployments and this is a rollback deployment
|
||||||
*/
|
*/
|
||||||
if (retain ||
|
if (retain
|
||||||
(osname != NULL && strcmp (ostree_deployment_get_osname (deployment), osname) != 0) ||
|
|| !osname_matches
|
||||||
is_merge_or_booted)
|
|| (retain_pending && !passed_crossover)
|
||||||
{
|
|| (is_booted || is_merge)
|
||||||
|
|| (retain_rollback && passed_crossover))
|
||||||
g_ptr_array_add (new_deployments, g_object_ref (deployment));
|
g_ptr_array_add (new_deployments, g_object_ref (deployment));
|
||||||
}
|
|
||||||
|
|
||||||
if (!added_new)
|
/* add right after booted/merge deployment */
|
||||||
|
if (!added_new && passed_crossover)
|
||||||
{
|
{
|
||||||
g_ptr_array_add (new_deployments, g_object_ref (new_deployment));
|
g_ptr_array_add (new_deployments, g_object_ref (new_deployment));
|
||||||
added_new = TRUE;
|
added_new = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In this non-default case , an improvement in the future would be
|
/* add it last if no crossover defined (or it's the first deployment in the sysroot) */
|
||||||
* to put the new deployment right after the current default in the
|
|
||||||
* order.
|
|
||||||
*/
|
|
||||||
if (!added_new)
|
if (!added_new)
|
||||||
{
|
{
|
||||||
g_ptr_array_add (new_deployments, g_object_ref (new_deployment));
|
g_ptr_array_add (new_deployments, g_object_ref (new_deployment));
|
||||||
added_new = TRUE;
|
added_new = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OstreeSysrootWriteDeploymentsOpts write_opts = { .do_postclean = postclean };
|
||||||
if (!ostree_sysroot_write_deployments_with_options (sysroot, new_deployments, &write_opts,
|
if (!ostree_sysroot_write_deployments_with_options (sysroot, new_deployments, &write_opts,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Deploy a copy of @target_deployment */
|
/* Deploy a copy of @target_deployment */
|
||||||
|
|
@ -1704,8 +1738,8 @@ ostree_sysroot_deployment_unlock (OstreeSysroot *self,
|
||||||
"/usr", 0755, error))
|
"/usr", 0755, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!glnx_mkdtempat (AT_FDCWD, development_ovldir, 0755, error))
|
if (g_mkdtemp_full (development_ovldir, 0755) == NULL)
|
||||||
return FALSE;
|
return glnx_throw_errno_prefix (error, "mkdtemp");
|
||||||
}
|
}
|
||||||
|
|
||||||
development_ovl_upper = glnx_strjoina (development_ovldir, "/upper");
|
development_ovl_upper = glnx_strjoina (development_ovldir, "/upper");
|
||||||
|
|
|
||||||
|
|
@ -207,6 +207,8 @@ typedef enum {
|
||||||
OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN = (1 << 0),
|
OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN = (1 << 0),
|
||||||
OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT = (1 << 1),
|
OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT = (1 << 1),
|
||||||
OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NO_CLEAN = (1 << 2),
|
OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NO_CLEAN = (1 << 2),
|
||||||
|
OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_PENDING = (1 << 3),
|
||||||
|
OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_ROLLBACK = (1 << 4),
|
||||||
} OstreeSysrootSimpleWriteDeploymentFlags;
|
} OstreeSysrootSimpleWriteDeploymentFlags;
|
||||||
|
|
||||||
_OSTREE_PUBLIC
|
_OSTREE_PUBLIC
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@
|
||||||
*
|
*
|
||||||
* Since: 2017.4
|
* Since: 2017.4
|
||||||
*/
|
*/
|
||||||
#define OSTREE_RELEASE_VERSION (10)
|
#define OSTREE_RELEASE_VERSION (11)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OSTREE_VERSION
|
* OSTREE_VERSION
|
||||||
|
|
@ -53,7 +53,7 @@
|
||||||
*
|
*
|
||||||
* Since: 2017.4
|
* Since: 2017.4
|
||||||
*/
|
*/
|
||||||
#define OSTREE_VERSION (2017.10)
|
#define OSTREE_VERSION (2017.11)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OSTREE_VERSION_S:
|
* OSTREE_VERSION_S:
|
||||||
|
|
@ -63,7 +63,7 @@
|
||||||
*
|
*
|
||||||
* Since: 2017.4
|
* Since: 2017.4
|
||||||
*/
|
*/
|
||||||
#define OSTREE_VERSION_S "2017.10"
|
#define OSTREE_VERSION_S "2017.11"
|
||||||
|
|
||||||
#define OSTREE_ENCODE_VERSION(year,release) \
|
#define OSTREE_ENCODE_VERSION(year,release) \
|
||||||
((year) << 16 | (release))
|
((year) << 16 | (release))
|
||||||
|
|
|
||||||
|
|
@ -90,6 +90,7 @@ ot_openat_read_stream (int dfd,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Like unlinkat() but ignore ENOENT */
|
||||||
gboolean
|
gboolean
|
||||||
ot_ensure_unlinked_at (int dfd,
|
ot_ensure_unlinked_at (int dfd,
|
||||||
const char *path,
|
const char *path,
|
||||||
|
|
|
||||||
|
|
@ -26,20 +26,23 @@
|
||||||
|
|
||||||
#include "libglnx.h"
|
#include "libglnx.h"
|
||||||
|
|
||||||
void
|
/* Like glnx_throw_errno_prefix, but takes @gpg_error */
|
||||||
ot_gpgme_error_to_gio_error (gpgme_error_t gpg_error,
|
gboolean
|
||||||
GError **error)
|
ot_gpgme_throw (gpgme_error_t gpg_error, GError **error,
|
||||||
|
const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
if (error == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
GIOErrorEnum errcode;
|
GIOErrorEnum errcode;
|
||||||
char errbuf[1024];
|
char errbuf[1024];
|
||||||
|
|
||||||
/* XXX This list is incomplete. Add cases as needed. */
|
/* XXX This list is incomplete. Add cases as needed. */
|
||||||
|
|
||||||
switch (gpgme_err_code (gpg_error))
|
switch (gpgme_err_code (gpg_error))
|
||||||
{
|
{
|
||||||
/* special case - shouldn't be here */
|
/* special case - shouldn't be here */
|
||||||
case GPG_ERR_NO_ERROR:
|
case GPG_ERR_NO_ERROR:
|
||||||
g_return_if_reached ();
|
g_assert_not_reached ();
|
||||||
|
|
||||||
/* special case - abort on out-of-memory */
|
/* special case - abort on out-of-memory */
|
||||||
case GPG_ERR_ENOMEM:
|
case GPG_ERR_ENOMEM:
|
||||||
|
|
@ -63,6 +66,12 @@ ot_gpgme_error_to_gio_error (gpgme_error_t gpg_error,
|
||||||
g_set_error (error, G_IO_ERROR, errcode, "%s: %s",
|
g_set_error (error, G_IO_ERROR, errcode, "%s: %s",
|
||||||
gpgme_strsource (gpg_error),
|
gpgme_strsource (gpg_error),
|
||||||
errbuf);
|
errbuf);
|
||||||
|
va_list args;
|
||||||
|
va_start (args, fmt);
|
||||||
|
glnx_real_set_prefix_error_va (*error, fmt, args);
|
||||||
|
va_end (args);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
|
@ -99,7 +108,7 @@ ot_gpgme_ctx_tmp_home_dir (gpgme_ctx_t gpgme_ctx,
|
||||||
NULL, tmp_home_dir);
|
NULL, tmp_home_dir);
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, error);
|
ot_gpgme_throw (gpg_error, error, "gpgme_ctx_set_engine_info");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -376,7 +385,6 @@ ot_gpgme_data_input (GInputStream *input_stream)
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
g_assert (gpgme_err_code (gpg_error) == GPG_ERR_ENOMEM);
|
g_assert (gpgme_err_code (gpg_error) == GPG_ERR_ENOMEM);
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, NULL);
|
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -399,7 +407,6 @@ ot_gpgme_data_output (GOutputStream *output_stream)
|
||||||
if (gpg_error != GPG_ERR_NO_ERROR)
|
if (gpg_error != GPG_ERR_NO_ERROR)
|
||||||
{
|
{
|
||||||
g_assert (gpgme_err_code (gpg_error) == GPG_ERR_ENOMEM);
|
g_assert (gpgme_err_code (gpg_error) == GPG_ERR_ENOMEM);
|
||||||
ot_gpgme_error_to_gio_error (gpg_error, NULL);
|
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -416,11 +423,7 @@ ot_gpgme_new_ctx (const char *homedir,
|
||||||
g_auto(gpgme_ctx_t) context = NULL;
|
g_auto(gpgme_ctx_t) context = NULL;
|
||||||
|
|
||||||
if ((err = gpgme_new (&context)) != GPG_ERR_NO_ERROR)
|
if ((err = gpgme_new (&context)) != GPG_ERR_NO_ERROR)
|
||||||
{
|
return ot_gpgme_throw (err, error, "Unable to create gpg context"), NULL;
|
||||||
ot_gpgme_error_to_gio_error (err, error);
|
|
||||||
g_prefix_error (error, "Unable to create gpg context: ");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (homedir != NULL)
|
if (homedir != NULL)
|
||||||
{
|
{
|
||||||
|
|
@ -430,12 +433,7 @@ ot_gpgme_new_ctx (const char *homedir,
|
||||||
|
|
||||||
if ((err = gpgme_ctx_set_engine_info (context, info->protocol, NULL, homedir))
|
if ((err = gpgme_ctx_set_engine_info (context, info->protocol, NULL, homedir))
|
||||||
!= GPG_ERR_NO_ERROR)
|
!= GPG_ERR_NO_ERROR)
|
||||||
{
|
return ot_gpgme_throw (err, error, "Unable to set gpg homedir to '%s'", homedir), NULL;
|
||||||
ot_gpgme_error_to_gio_error (err, error);
|
|
||||||
g_prefix_error (error, "Unable to set gpg homedir to '%s': ",
|
|
||||||
homedir);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_steal_pointer (&context);
|
return g_steal_pointer (&context);
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,8 @@ G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_data_t, gpgme_data_release, NULL)
|
||||||
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_ctx_t, gpgme_release, NULL)
|
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_ctx_t, gpgme_release, NULL)
|
||||||
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_key_t, gpgme_key_unref, NULL)
|
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(gpgme_key_t, gpgme_key_unref, NULL)
|
||||||
|
|
||||||
void ot_gpgme_error_to_gio_error (gpgme_error_t gpg_error, GError **error);
|
gboolean ot_gpgme_throw (gpgme_error_t gpg_error, GError **error,
|
||||||
|
const char *fmt, ...) G_GNUC_PRINTF (3, 4);
|
||||||
|
|
||||||
gboolean ot_gpgme_ctx_tmp_home_dir (gpgme_ctx_t gpgme_ctx,
|
gboolean ot_gpgme_ctx_tmp_home_dir (gpgme_ctx_t gpgme_ctx,
|
||||||
char **out_tmp_home_dir,
|
char **out_tmp_home_dir,
|
||||||
|
|
|
||||||
|
|
@ -52,9 +52,6 @@ ot_admin_builtin_cleanup (int argc, char **argv, GCancellable *cancellable, GErr
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (!ostree_sysroot_cleanup (sysroot, cancellable, error))
|
if (!ostree_sysroot_cleanup (sysroot, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,9 @@
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
|
||||||
static gboolean opt_retain;
|
static gboolean opt_retain;
|
||||||
|
static gboolean opt_retain_pending;
|
||||||
|
static gboolean opt_retain_rollback;
|
||||||
|
static gboolean opt_not_as_default;
|
||||||
static char **opt_kernel_argv;
|
static char **opt_kernel_argv;
|
||||||
static char **opt_kernel_argv_append;
|
static char **opt_kernel_argv_append;
|
||||||
static gboolean opt_kernel_proc_cmdline;
|
static gboolean opt_kernel_proc_cmdline;
|
||||||
|
|
@ -47,7 +50,10 @@ static char *opt_origin_path;
|
||||||
static GOptionEntry options[] = {
|
static GOptionEntry options[] = {
|
||||||
{ "os", 0, 0, G_OPTION_ARG_STRING, &opt_osname, "Use a different operating system root than the current one", "OSNAME" },
|
{ "os", 0, 0, G_OPTION_ARG_STRING, &opt_osname, "Use a different operating system root than the current one", "OSNAME" },
|
||||||
{ "origin-file", 0, 0, G_OPTION_ARG_FILENAME, &opt_origin_path, "Specify origin file", "FILENAME" },
|
{ "origin-file", 0, 0, G_OPTION_ARG_FILENAME, &opt_origin_path, "Specify origin file", "FILENAME" },
|
||||||
{ "retain", 0, 0, G_OPTION_ARG_NONE, &opt_retain, "Do not delete previous deployment", NULL },
|
{ "retain", 0, 0, G_OPTION_ARG_NONE, &opt_retain, "Do not delete previous deployments", NULL },
|
||||||
|
{ "retain-pending", 0, 0, G_OPTION_ARG_NONE, &opt_retain_pending, "Do not delete pending deployments", NULL },
|
||||||
|
{ "retain-rollback", 0, 0, G_OPTION_ARG_NONE, &opt_retain_rollback, "Do not delete rollback deployments", NULL },
|
||||||
|
{ "not-as-default", 0, 0, G_OPTION_ARG_NONE, &opt_not_as_default, "Append rather than prepend new deployment", NULL },
|
||||||
{ "karg-proc-cmdline", 0, 0, G_OPTION_ARG_NONE, &opt_kernel_proc_cmdline, "Import current /proc/cmdline", NULL },
|
{ "karg-proc-cmdline", 0, 0, G_OPTION_ARG_NONE, &opt_kernel_proc_cmdline, "Import current /proc/cmdline", NULL },
|
||||||
{ "karg", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_kernel_argv, "Set kernel argument, like root=/dev/sda1; this overrides any earlier argument with the same name", "NAME=VALUE" },
|
{ "karg", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_kernel_argv, "Set kernel argument, like root=/dev/sda1; this overrides any earlier argument with the same name", "NAME=VALUE" },
|
||||||
{ "karg-append", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_kernel_argv_append, "Append kernel argument; useful with e.g. console= that can be used multiple times", "NAME=VALUE" },
|
{ "karg-append", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_kernel_argv_append, "Append kernel argument; useful with e.g. console= that can be used multiple times", "NAME=VALUE" },
|
||||||
|
|
@ -57,64 +63,53 @@ static GOptionEntry options[] = {
|
||||||
gboolean
|
gboolean
|
||||||
ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GError **error)
|
ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
const char *refspec;
|
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
|
||||||
g_autoptr(OstreeSysroot) sysroot = NULL;
|
|
||||||
g_autoptr(GKeyFile) origin = NULL;
|
|
||||||
g_autoptr(OstreeRepo) repo = NULL;
|
|
||||||
g_autoptr(OstreeDeployment) new_deployment = NULL;
|
|
||||||
g_autoptr(OstreeDeployment) merge_deployment = NULL;
|
|
||||||
g_autofree char *revision = NULL;
|
|
||||||
__attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL;
|
__attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL;
|
||||||
|
|
||||||
context = g_option_context_new ("REFSPEC - Checkout revision REFSPEC as the new default deployment");
|
g_autoptr(GOptionContext) context =
|
||||||
|
g_option_context_new ("REFSPEC - Checkout revision REFSPEC as the new default deployment");
|
||||||
|
|
||||||
|
g_autoptr(OstreeSysroot) sysroot = NULL;
|
||||||
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
|
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER,
|
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER,
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
ot_util_usage_error (context, "REF/REV must be specified", error);
|
ot_util_usage_error (context, "REF/REV must be specified", error);
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
refspec = argv[1];
|
const char *refspec = argv[1];
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
OstreeRepo *repo = ostree_sysroot_repo (sysroot);
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* Find the currently booted deployment, if any; we will ensure it
|
/* Find the currently booted deployment, if any; we will ensure it
|
||||||
* is present in the new deployment list.
|
* is present in the new deployment list.
|
||||||
*/
|
*/
|
||||||
if (!ot_admin_require_booted_deployment_or_osname (sysroot, opt_osname,
|
if (!ot_admin_require_booted_deployment_or_osname (sysroot, opt_osname,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
{
|
return glnx_prefix_error (error, "Looking for booted deployment");
|
||||||
g_prefix_error (error, "Looking for booted deployment: ");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
g_autoptr(GKeyFile) origin = NULL;
|
||||||
if (opt_origin_path)
|
if (opt_origin_path)
|
||||||
{
|
{
|
||||||
origin = g_key_file_new ();
|
origin = g_key_file_new ();
|
||||||
|
|
||||||
if (!g_key_file_load_from_file (origin, opt_origin_path, 0, error))
|
if (!g_key_file_load_from_file (origin, opt_origin_path, 0, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
origin = ostree_sysroot_origin_new_from_refspec (sysroot, refspec);
|
origin = ostree_sysroot_origin_new_from_refspec (sysroot, refspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_autofree char *revision = NULL;
|
||||||
if (!ostree_repo_resolve_rev (repo, refspec, FALSE, &revision, error))
|
if (!ostree_repo_resolve_rev (repo, refspec, FALSE, &revision, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
merge_deployment = ostree_sysroot_get_merge_deployment (sysroot, opt_osname);
|
g_autoptr(OstreeDeployment) merge_deployment =
|
||||||
|
ostree_sysroot_get_merge_deployment (sysroot, opt_osname);
|
||||||
|
|
||||||
/* Here we perform cleanup of any leftover data from previous
|
/* Here we perform cleanup of any leftover data from previous
|
||||||
* partial failures. This avoids having to call
|
* partial failures. This avoids having to call
|
||||||
|
|
@ -124,10 +119,7 @@ ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GErro
|
||||||
* we find it.
|
* we find it.
|
||||||
*/
|
*/
|
||||||
if (!ostree_sysroot_prepare_cleanup (sysroot, cancellable, error))
|
if (!ostree_sysroot_prepare_cleanup (sysroot, cancellable, error))
|
||||||
{
|
return glnx_prefix_error (error, "Performing initial cleanup");
|
||||||
g_prefix_error (error, "Performing initial cleanup: ");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
kargs = _ostree_kernel_args_new ();
|
kargs = _ostree_kernel_args_new ();
|
||||||
|
|
||||||
|
|
@ -137,7 +129,7 @@ ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GErro
|
||||||
if (opt_kernel_proc_cmdline)
|
if (opt_kernel_proc_cmdline)
|
||||||
{
|
{
|
||||||
if (!_ostree_kernel_args_append_proc_cmdline (kargs, cancellable, error))
|
if (!_ostree_kernel_args_append_proc_cmdline (kargs, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else if (merge_deployment)
|
else if (merge_deployment)
|
||||||
{
|
{
|
||||||
|
|
@ -157,24 +149,29 @@ ot_admin_builtin_deploy (int argc, char **argv, GCancellable *cancellable, GErro
|
||||||
_ostree_kernel_args_append_argv (kargs, opt_kernel_argv_append);
|
_ostree_kernel_args_append_argv (kargs, opt_kernel_argv_append);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
g_autoptr(OstreeDeployment) new_deployment = NULL;
|
||||||
g_auto(GStrv) kargs_strv = _ostree_kernel_args_to_strv (kargs);
|
g_auto(GStrv) kargs_strv = _ostree_kernel_args_to_strv (kargs);
|
||||||
|
if (!ostree_sysroot_deploy_tree (sysroot, opt_osname, revision, origin, merge_deployment,
|
||||||
|
kargs_strv, &new_deployment, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (!ostree_sysroot_deploy_tree (sysroot,
|
OstreeSysrootSimpleWriteDeploymentFlags flags = 0;
|
||||||
opt_osname, revision, origin,
|
if (opt_retain)
|
||||||
merge_deployment, kargs_strv,
|
flags |= OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN;
|
||||||
&new_deployment,
|
else
|
||||||
cancellable, error))
|
{
|
||||||
goto out;
|
if (opt_retain_pending)
|
||||||
|
flags |= OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_PENDING;
|
||||||
|
if (opt_retain_rollback)
|
||||||
|
flags |= OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN_ROLLBACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ostree_sysroot_simple_write_deployment (sysroot, opt_osname,
|
if (opt_not_as_default)
|
||||||
new_deployment, merge_deployment,
|
flags |= OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT;
|
||||||
opt_retain ? OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN : 0,
|
|
||||||
cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = TRUE;
|
if (!ostree_sysroot_simple_write_deployment (sysroot, opt_osname, new_deployment,
|
||||||
out:
|
merge_deployment, flags, cancellable, error))
|
||||||
return ret;
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,9 +64,6 @@ ot_admin_builtin_diff (int argc, char **argv, GCancellable *cancellable, GError
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (!ot_admin_require_booted_deployment_or_osname (sysroot, opt_osname,
|
if (!ot_admin_require_booted_deployment_or_osname (sysroot, opt_osname,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
||||||
|
|
@ -41,57 +41,51 @@ static GOptionEntry options[] = {
|
||||||
gboolean
|
gboolean
|
||||||
ot_admin_builtin_init_fs (int argc, char **argv, GCancellable *cancellable, GError **error)
|
ot_admin_builtin_init_fs (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
g_autoptr(GOptionContext) context = g_option_context_new ("PATH - Initialize a root filesystem");
|
||||||
g_autoptr(OstreeSysroot) sysroot = NULL;
|
|
||||||
gboolean ret = FALSE;
|
|
||||||
glnx_fd_close int root_dfd = -1;
|
|
||||||
g_autoptr(OstreeSysroot) target_sysroot = NULL;
|
|
||||||
guint i;
|
|
||||||
const char *normal_toplevels[] = {"boot", "dev", "home", "proc", "run", "sys"};
|
|
||||||
|
|
||||||
context = g_option_context_new ("PATH - Initialize a root filesystem");
|
|
||||||
|
|
||||||
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
|
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED,
|
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER |
|
||||||
&sysroot, cancellable, error))
|
OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED |
|
||||||
goto out;
|
OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT,
|
||||||
|
NULL, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
ot_util_usage_error (context, "PATH must be specified", error);
|
ot_util_usage_error (context, "PATH must be specified", error);
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!glnx_opendirat (AT_FDCWD, argv[1], TRUE, &root_dfd, error))
|
const char *sysroot_path = argv[1];
|
||||||
goto out;
|
|
||||||
{ g_autoptr(GFile) dir = g_file_new_for_path (argv[1]);
|
|
||||||
target_sysroot = ostree_sysroot_new (dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS(normal_toplevels); i++)
|
glnx_fd_close int root_dfd = -1;
|
||||||
|
if (!glnx_opendirat (AT_FDCWD, sysroot_path, TRUE, &root_dfd, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
const char *normal_toplevels[] = {"boot", "dev", "home", "proc", "run", "sys"};
|
||||||
|
for (guint i = 0; i < G_N_ELEMENTS (normal_toplevels); i++)
|
||||||
{
|
{
|
||||||
if (!glnx_shutil_mkdir_p_at (root_dfd, normal_toplevels[i], 0755,
|
if (!glnx_shutil_mkdir_p_at (root_dfd, normal_toplevels[i], 0755,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!glnx_shutil_mkdir_p_at (root_dfd, "root", 0700,
|
if (!glnx_shutil_mkdir_p_at (root_dfd, "root", 0700,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!glnx_shutil_mkdir_p_at (root_dfd, "tmp", 01777,
|
if (!glnx_shutil_mkdir_p_at (root_dfd, "tmp", 01777,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
if (fchmodat (root_dfd, "tmp", 01777, 0) == -1)
|
if (fchmodat (root_dfd, "tmp", 01777, 0) == -1)
|
||||||
{
|
{
|
||||||
glnx_set_prefix_error_from_errno (error, "chmod: %s", "tmp");
|
glnx_set_prefix_error_from_errno (error, "chmod: %s", "tmp");
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
g_autoptr(GFile) dir = g_file_new_for_path (sysroot_path);
|
||||||
|
g_autoptr(OstreeSysroot) sysroot = ostree_sysroot_new (dir);
|
||||||
|
if (!ostree_sysroot_ensure_initialized (sysroot, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (!ostree_sysroot_ensure_initialized (target_sysroot, cancellable, error))
|
return TRUE;
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -65,10 +65,7 @@ ostree_admin_instutil_option_context_new_with_commands (void)
|
||||||
gboolean
|
gboolean
|
||||||
ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GError **error)
|
ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
OstreeAdminInstUtilCommand *subcommand;
|
|
||||||
const char *subcommand_name = NULL;
|
const char *subcommand_name = NULL;
|
||||||
g_autofree char *prgname = NULL;
|
|
||||||
int in, out;
|
int in, out;
|
||||||
|
|
||||||
for (in = 1, out = 1; in < argc; in++, out++)
|
for (in = 1, out = 1; in < argc; in++, out++)
|
||||||
|
|
@ -94,7 +91,7 @@ ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GEr
|
||||||
|
|
||||||
argc = out;
|
argc = out;
|
||||||
|
|
||||||
subcommand = admin_instutil_subcommands;
|
OstreeAdminInstUtilCommand *subcommand = admin_instutil_subcommands;
|
||||||
while (subcommand->name)
|
while (subcommand->name)
|
||||||
{
|
{
|
||||||
if (g_strcmp0 (subcommand_name, subcommand->name) == 0)
|
if (g_strcmp0 (subcommand_name, subcommand->name) == 0)
|
||||||
|
|
@ -104,14 +101,12 @@ ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GEr
|
||||||
|
|
||||||
if (!subcommand->name)
|
if (!subcommand->name)
|
||||||
{
|
{
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
g_autoptr(GOptionContext) context =
|
||||||
g_autofree char *help;
|
ostree_admin_instutil_option_context_new_with_commands ();
|
||||||
|
|
||||||
context = ostree_admin_instutil_option_context_new_with_commands ();
|
|
||||||
|
|
||||||
/* This will not return for some options (e.g. --version). */
|
/* This will not return for some options (e.g. --version). */
|
||||||
if (ostree_admin_option_context_parse (context, NULL, &argc, &argv,
|
if (ostree_admin_option_context_parse (context, NULL, &argc, &argv,
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED,
|
OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT,
|
||||||
NULL, cancellable, error))
|
NULL, cancellable, error))
|
||||||
{
|
{
|
||||||
if (subcommand_name == NULL)
|
if (subcommand_name == NULL)
|
||||||
|
|
@ -126,19 +121,16 @@ ot_admin_builtin_instutil (int argc, char **argv, GCancellable *cancellable, GEr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
help = g_option_context_get_help (context, FALSE, NULL);
|
g_autofree char *help = g_option_context_get_help (context, FALSE, NULL);
|
||||||
g_printerr ("%s", help);
|
g_printerr ("%s", help);
|
||||||
|
return FALSE;
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prgname = g_strdup_printf ("%s %s", g_get_prgname (), subcommand_name);
|
g_autofree char *prgname = g_strdup_printf ("%s %s", g_get_prgname (), subcommand_name);
|
||||||
g_set_prgname (prgname);
|
g_set_prgname (prgname);
|
||||||
|
|
||||||
if (!subcommand->fn (argc, argv, cancellable, error))
|
if (!subcommand->fn (argc, argv, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -75,9 +75,6 @@ ot_admin_builtin_set_origin (int argc, char **argv, GCancellable *cancellable, G
|
||||||
if (argc > 3)
|
if (argc > 3)
|
||||||
branch = argv[3];
|
branch = argv[3];
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
|
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -108,9 +108,6 @@ ot_admin_builtin_status (int argc, char **argv, GCancellable *cancellable, GErro
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
|
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,54 +47,38 @@ static GOptionEntry options[] = {
|
||||||
gboolean
|
gboolean
|
||||||
ot_admin_builtin_switch (int argc, char **argv, GCancellable *cancellable, GError **error)
|
ot_admin_builtin_switch (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
g_autoptr(GOptionContext) context =
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
g_option_context_new ("REF - Construct new tree from REF and deploy it");
|
||||||
g_autoptr(OstreeSysroot) sysroot = NULL;
|
g_autoptr(OstreeSysroot) sysroot = NULL;
|
||||||
const char *new_provided_refspec = NULL;
|
|
||||||
g_autoptr(OstreeRepo) repo = NULL;
|
|
||||||
g_autofree char *origin_refspec = NULL;
|
|
||||||
g_autofree char *origin_remote = NULL;
|
|
||||||
g_autofree char *origin_ref = NULL;
|
|
||||||
g_autofree char *new_remote = NULL;
|
|
||||||
g_autofree char *new_ref = NULL;
|
|
||||||
g_autofree char *new_refspec = NULL;
|
|
||||||
const char* remote;
|
|
||||||
g_autoptr(OstreeSysrootUpgrader) upgrader = NULL;
|
|
||||||
g_autoptr(OstreeAsyncProgress) progress = NULL;
|
|
||||||
gboolean changed;
|
|
||||||
GKeyFile *old_origin;
|
|
||||||
g_autoptr(GKeyFile) new_origin = NULL;
|
|
||||||
|
|
||||||
context = g_option_context_new ("REF - Construct new tree from REF and deploy it");
|
|
||||||
|
|
||||||
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
|
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER,
|
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER,
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
ot_util_usage_error (context, "REF must be specified", error);
|
ot_util_usage_error (context, "REF must be specified", error);
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_provided_refspec = argv[1];
|
const char *new_provided_refspec = argv[1];
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
g_autoptr(OstreeSysrootUpgrader) upgrader =
|
||||||
goto out;
|
ostree_sysroot_upgrader_new_for_os_with_flags (sysroot, opt_osname,
|
||||||
|
|
||||||
upgrader = ostree_sysroot_upgrader_new_for_os_with_flags (sysroot, opt_osname,
|
|
||||||
OSTREE_SYSROOT_UPGRADER_FLAGS_IGNORE_UNCONFIGURED,
|
OSTREE_SYSROOT_UPGRADER_FLAGS_IGNORE_UNCONFIGURED,
|
||||||
cancellable, error);
|
cancellable, error);
|
||||||
if (!upgrader)
|
if (!upgrader)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
old_origin = ostree_sysroot_upgrader_get_origin (upgrader);
|
|
||||||
origin_refspec = g_key_file_get_string (old_origin, "origin", "refspec", NULL);
|
|
||||||
|
|
||||||
|
GKeyFile *old_origin = ostree_sysroot_upgrader_get_origin (upgrader);
|
||||||
|
g_autofree char *origin_refspec = g_key_file_get_string (old_origin, "origin", "refspec", NULL);
|
||||||
|
g_autofree char *origin_remote = NULL;
|
||||||
|
g_autofree char *origin_ref = NULL;
|
||||||
if (!ostree_parse_refspec (origin_refspec, &origin_remote, &origin_ref, error))
|
if (!ostree_parse_refspec (origin_refspec, &origin_remote, &origin_ref, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
|
g_autofree char *new_remote = NULL;
|
||||||
|
g_autofree char *new_ref = NULL;
|
||||||
/* Allow just switching remotes */
|
/* Allow just switching remotes */
|
||||||
if (g_str_has_suffix (new_provided_refspec, ":"))
|
if (g_str_has_suffix (new_provided_refspec, ":"))
|
||||||
{
|
{
|
||||||
|
|
@ -105,14 +89,11 @@ ot_admin_builtin_switch (int argc, char **argv, GCancellable *cancellable, GErro
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ostree_parse_refspec (new_provided_refspec, &new_remote, &new_ref, error))
|
if (!ostree_parse_refspec (new_provided_refspec, &new_remote, &new_ref, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!new_remote)
|
const char* remote = new_remote ?: origin_remote;
|
||||||
remote = origin_remote;
|
g_autofree char *new_refspec = NULL;
|
||||||
else
|
|
||||||
remote = new_remote;
|
|
||||||
|
|
||||||
if (remote)
|
if (remote)
|
||||||
new_refspec = g_strconcat (remote, ":", new_ref, NULL);
|
new_refspec = g_strconcat (remote, ":", new_ref, NULL);
|
||||||
else
|
else
|
||||||
|
|
@ -122,54 +103,52 @@ ot_admin_builtin_switch (int argc, char **argv, GCancellable *cancellable, GErro
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
"Old and new refs are equal: %s", new_refspec);
|
"Old and new refs are equal: %s", new_refspec);
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_origin = ostree_sysroot_origin_new_from_refspec (sysroot, new_refspec);
|
g_autoptr(GKeyFile) new_origin = ostree_sysroot_origin_new_from_refspec (sysroot, new_refspec);
|
||||||
if (!ostree_sysroot_upgrader_set_origin (upgrader, new_origin, cancellable, error))
|
if (!ostree_sysroot_upgrader_set_origin (upgrader, new_origin, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
{ g_auto(GLnxConsoleRef) console = { 0, };
|
{ g_auto(GLnxConsoleRef) console = { 0, };
|
||||||
glnx_console_lock (&console);
|
glnx_console_lock (&console);
|
||||||
|
|
||||||
|
g_autoptr(OstreeAsyncProgress) progress = NULL;
|
||||||
if (console.is_tty)
|
if (console.is_tty)
|
||||||
progress = ostree_async_progress_new_and_connect (ostree_repo_pull_default_console_progress_changed, &console);
|
progress = ostree_async_progress_new_and_connect (ostree_repo_pull_default_console_progress_changed, &console);
|
||||||
|
|
||||||
/* Always allow older...there's not going to be a chronological
|
/* Always allow older...there's not going to be a chronological
|
||||||
* relationship necessarily.
|
* relationship necessarily.
|
||||||
*/
|
*/
|
||||||
|
gboolean changed;
|
||||||
if (!ostree_sysroot_upgrader_pull (upgrader, 0,
|
if (!ostree_sysroot_upgrader_pull (upgrader, 0,
|
||||||
OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_ALLOW_OLDER,
|
OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_ALLOW_OLDER,
|
||||||
progress, &changed,
|
progress, &changed,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (progress)
|
if (progress)
|
||||||
ostree_async_progress_finish (progress);
|
ostree_async_progress_finish (progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ostree_sysroot_upgrader_deploy (upgrader, cancellable, error))
|
if (!ostree_sysroot_upgrader_deploy (upgrader, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!ostree_sysroot_get_repo (sysroot, &repo, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
|
OstreeRepo *repo = ostree_sysroot_repo (sysroot);
|
||||||
if (!ostree_repo_prepare_transaction (repo, NULL, cancellable, error))
|
if (!ostree_repo_prepare_transaction (repo, NULL, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
g_print ("Deleting ref '%s:%s'\n", origin_remote, origin_ref);
|
g_print ("Deleting ref '%s:%s'\n", origin_remote, origin_ref);
|
||||||
ostree_repo_transaction_set_ref (repo, origin_remote, origin_ref, NULL);
|
ostree_repo_transaction_set_ref (repo, origin_remote, origin_ref, NULL);
|
||||||
|
|
||||||
if (!ostree_repo_commit_transaction (repo, NULL, cancellable, error))
|
if (!ostree_repo_commit_transaction (repo, NULL, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (opt_reboot)
|
if (opt_reboot)
|
||||||
{
|
{
|
||||||
if (!ot_admin_execve_reboot (sysroot, error))
|
if (!ot_admin_execve_reboot (sysroot, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -60,8 +60,6 @@ ot_admin_builtin_undeploy (int argc, char **argv, GCancellable *cancellable, GEr
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
return FALSE;
|
|
||||||
current_deployments = ostree_sysroot_get_deployments (sysroot);
|
current_deployments = ostree_sysroot_get_deployments (sysroot);
|
||||||
|
|
||||||
deploy_index_str = argv[1];
|
deploy_index_str = argv[1];
|
||||||
|
|
|
||||||
|
|
@ -65,9 +65,6 @@ ot_admin_builtin_unlock (int argc, char **argv, GCancellable *cancellable, GErro
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
booted_deployment = ostree_sysroot_get_booted_deployment (sysroot);
|
booted_deployment = ostree_sysroot_get_booted_deployment (sysroot);
|
||||||
if (!booted_deployment)
|
if (!booted_deployment)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -57,44 +57,34 @@ static GOptionEntry options[] = {
|
||||||
gboolean
|
gboolean
|
||||||
ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GError **error)
|
ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
g_autoptr(GOptionContext) context = g_option_context_new ("Construct new tree from current origin and deploy it, if it changed");
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
|
||||||
g_autoptr(OstreeSysroot) sysroot = NULL;
|
g_autoptr(OstreeSysroot) sysroot = NULL;
|
||||||
g_autoptr(OstreeSysrootUpgrader) upgrader = NULL;
|
|
||||||
g_autoptr(GKeyFile) origin = NULL;
|
|
||||||
g_autoptr(OstreeAsyncProgress) progress = NULL;
|
|
||||||
gboolean changed;
|
|
||||||
OstreeSysrootUpgraderPullFlags upgraderpullflags = 0;
|
|
||||||
|
|
||||||
context = g_option_context_new ("Construct new tree from current origin and deploy it, if it changed");
|
|
||||||
|
|
||||||
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
|
if (!ostree_admin_option_context_parse (context, options, &argc, &argv,
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER,
|
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER,
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (opt_pull_only && opt_deploy_only)
|
if (opt_pull_only && opt_deploy_only)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
"Cannot simultaneously specify --pull-only and --deploy-only");
|
"Cannot simultaneously specify --pull-only and --deploy-only");
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else if (opt_pull_only && opt_reboot)
|
else if (opt_pull_only && opt_reboot)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
"Cannot simultaneously specify --pull-only and --reboot");
|
"Cannot simultaneously specify --pull-only and --reboot");
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
g_autoptr(OstreeSysrootUpgrader) upgrader =
|
||||||
goto out;
|
ostree_sysroot_upgrader_new_for_os (sysroot, opt_osname,
|
||||||
|
|
||||||
upgrader = ostree_sysroot_upgrader_new_for_os (sysroot, opt_osname,
|
|
||||||
cancellable, error);
|
cancellable, error);
|
||||||
if (!upgrader)
|
if (!upgrader)
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
origin = ostree_sysroot_upgrader_dup_origin (upgrader);
|
g_autoptr(GKeyFile) origin = ostree_sysroot_upgrader_dup_origin (upgrader);
|
||||||
if (origin != NULL)
|
if (origin != NULL)
|
||||||
{
|
{
|
||||||
gboolean origin_changed = FALSE;
|
gboolean origin_changed = FALSE;
|
||||||
|
|
@ -122,16 +112,19 @@ ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GErr
|
||||||
{
|
{
|
||||||
/* XXX GCancellable parameter is not used. */
|
/* XXX GCancellable parameter is not used. */
|
||||||
if (!ostree_sysroot_upgrader_set_origin (upgrader, origin, NULL, error))
|
if (!ostree_sysroot_upgrader_set_origin (upgrader, origin, NULL, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean changed;
|
||||||
|
OstreeSysrootUpgraderPullFlags upgraderpullflags = 0;
|
||||||
if (opt_deploy_only)
|
if (opt_deploy_only)
|
||||||
upgraderpullflags |= OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_SYNTHETIC;
|
upgraderpullflags |= OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_SYNTHETIC;
|
||||||
|
|
||||||
{ g_auto(GLnxConsoleRef) console = { 0, };
|
{ g_auto(GLnxConsoleRef) console = { 0, };
|
||||||
glnx_console_lock (&console);
|
glnx_console_lock (&console);
|
||||||
|
|
||||||
|
g_autoptr(OstreeAsyncProgress) progress = NULL;
|
||||||
if (console.is_tty)
|
if (console.is_tty)
|
||||||
progress = ostree_async_progress_new_and_connect (ostree_repo_pull_default_console_progress_changed, &console);
|
progress = ostree_async_progress_new_and_connect (ostree_repo_pull_default_console_progress_changed, &console);
|
||||||
|
|
||||||
|
|
@ -152,7 +145,7 @@ ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GErr
|
||||||
*/
|
*/
|
||||||
if (opt_pull_only)
|
if (opt_pull_only)
|
||||||
(void) ostree_sysroot_cleanup (sysroot, NULL, NULL);
|
(void) ostree_sysroot_cleanup (sysroot, NULL, NULL);
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress)
|
if (progress)
|
||||||
|
|
@ -168,17 +161,15 @@ ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GErr
|
||||||
if (!opt_pull_only)
|
if (!opt_pull_only)
|
||||||
{
|
{
|
||||||
if (!ostree_sysroot_upgrader_deploy (upgrader, cancellable, error))
|
if (!ostree_sysroot_upgrader_deploy (upgrader, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_reboot)
|
if (opt_reboot)
|
||||||
{
|
{
|
||||||
if (!ot_admin_execve_reboot (sysroot, error))
|
if (!ot_admin_execve_reboot (sysroot, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -151,13 +151,15 @@ ot_admin_sysroot_lock (OstreeSysroot *sysroot,
|
||||||
gboolean
|
gboolean
|
||||||
ot_admin_execve_reboot (OstreeSysroot *sysroot, GError **error)
|
ot_admin_execve_reboot (OstreeSysroot *sysroot, GError **error)
|
||||||
{
|
{
|
||||||
g_autoptr(GFile) real_sysroot = g_file_new_for_path ("/");
|
OstreeDeployment *booted = ostree_sysroot_get_booted_deployment (sysroot);
|
||||||
|
|
||||||
|
/* If the sysroot isn't booted, we shouldn't reboot, even if somehow the user
|
||||||
|
* asked for it; might accidentally be specified in a build script, etc.
|
||||||
|
*/
|
||||||
|
if (!booted)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
if (g_file_equal (ostree_sysroot_get_path (sysroot), real_sysroot))
|
|
||||||
{
|
|
||||||
if (execlp ("systemctl", "systemctl", "reboot", NULL) < 0)
|
if (execlp ("systemctl", "systemctl", "reboot", NULL) < 0)
|
||||||
return glnx_throw_errno (error);
|
return glnx_throw_errno_prefix (error, "execve(systemctl reboot)");
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,9 +53,6 @@ ot_admin_instutil_builtin_grub2_generate (int argc, char **argv, GCancellable *c
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (argc >= 2)
|
if (argc >= 2)
|
||||||
{
|
{
|
||||||
bootversion = (guint) g_ascii_strtoull (argv[1], NULL, 10);
|
bootversion = (guint) g_ascii_strtoull (argv[1], NULL, 10);
|
||||||
|
|
|
||||||
|
|
@ -204,9 +204,6 @@ ot_admin_instutil_builtin_selinux_ensure_labeled (int argc, char **argv, GCancel
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
deployments = ostree_sysroot_get_deployments (sysroot);
|
deployments = ostree_sysroot_get_deployments (sysroot);
|
||||||
if (deployments->len == 0)
|
if (deployments->len == 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -66,9 +66,6 @@ ot_admin_instutil_builtin_set_kargs (int argc, char **argv, GCancellable *cancel
|
||||||
&sysroot, cancellable, error))
|
&sysroot, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
deployments = ostree_sysroot_get_deployments (sysroot);
|
deployments = ostree_sysroot_get_deployments (sysroot);
|
||||||
if (deployments->len == 0)
|
if (deployments->len == 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -126,7 +126,7 @@ ostree_builtin_admin (int argc, char **argv, GCancellable *cancellable, GError *
|
||||||
|
|
||||||
/* This will not return for some options (e.g. --version). */
|
/* This will not return for some options (e.g. --version). */
|
||||||
if (ostree_admin_option_context_parse (context, NULL, &argc, &argv,
|
if (ostree_admin_option_context_parse (context, NULL, &argc, &argv,
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_NONE | OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED,
|
OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT,
|
||||||
NULL, cancellable, error))
|
NULL, cancellable, error))
|
||||||
{
|
{
|
||||||
if (subcommand_name == NULL)
|
if (subcommand_name == NULL)
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ static gboolean opt_disable_cache;
|
||||||
static char *opt_subpath;
|
static char *opt_subpath;
|
||||||
static gboolean opt_union;
|
static gboolean opt_union;
|
||||||
static gboolean opt_union_add;
|
static gboolean opt_union_add;
|
||||||
|
static gboolean opt_union_identical;
|
||||||
static gboolean opt_whiteouts;
|
static gboolean opt_whiteouts;
|
||||||
static gboolean opt_from_stdin;
|
static gboolean opt_from_stdin;
|
||||||
static char *opt_from_file;
|
static char *opt_from_file;
|
||||||
|
|
@ -72,6 +73,7 @@ static GOptionEntry options[] = {
|
||||||
{ "subpath", 0, 0, G_OPTION_ARG_FILENAME, &opt_subpath, "Checkout sub-directory PATH", "PATH" },
|
{ "subpath", 0, 0, G_OPTION_ARG_FILENAME, &opt_subpath, "Checkout sub-directory PATH", "PATH" },
|
||||||
{ "union", 0, 0, G_OPTION_ARG_NONE, &opt_union, "Keep existing directories, overwrite existing files", NULL },
|
{ "union", 0, 0, G_OPTION_ARG_NONE, &opt_union, "Keep existing directories, overwrite existing files", NULL },
|
||||||
{ "union-add", 0, 0, G_OPTION_ARG_NONE, &opt_union_add, "Keep existing files/directories, only add new", NULL },
|
{ "union-add", 0, 0, G_OPTION_ARG_NONE, &opt_union_add, "Keep existing files/directories, only add new", NULL },
|
||||||
|
{ "union-identical", 0, 0, G_OPTION_ARG_NONE, &opt_union_identical, "When layering checkouts, error out if a file would be replaced with a different version, but add new files and directories", NULL },
|
||||||
{ "whiteouts", 0, 0, G_OPTION_ARG_NONE, &opt_whiteouts, "Process 'whiteout' (Docker style) entries", NULL },
|
{ "whiteouts", 0, 0, G_OPTION_ARG_NONE, &opt_whiteouts, "Process 'whiteout' (Docker style) entries", NULL },
|
||||||
{ "allow-noent", 0, 0, G_OPTION_ARG_NONE, &opt_allow_noent, "Do nothing if specified path does not exist", NULL },
|
{ "allow-noent", 0, 0, G_OPTION_ARG_NONE, &opt_allow_noent, "Do nothing if specified path does not exist", NULL },
|
||||||
{ "from-stdin", 0, 0, G_OPTION_ARG_NONE, &opt_from_stdin, "Process many checkouts from standard input", NULL },
|
{ "from-stdin", 0, 0, G_OPTION_ARG_NONE, &opt_from_stdin, "Process many checkouts from standard input", NULL },
|
||||||
|
|
@ -99,7 +101,7 @@ process_one_checkout (OstreeRepo *repo,
|
||||||
* convenient infrastructure for testing C APIs with data.
|
* convenient infrastructure for testing C APIs with data.
|
||||||
*/
|
*/
|
||||||
if (opt_disable_cache || opt_whiteouts || opt_require_hardlinks ||
|
if (opt_disable_cache || opt_whiteouts || opt_require_hardlinks ||
|
||||||
opt_union_add || opt_force_copy || opt_bareuseronly_dirs)
|
opt_union_add || opt_force_copy || opt_bareuseronly_dirs || opt_union_identical)
|
||||||
{
|
{
|
||||||
OstreeRepoCheckoutAtOptions options = { 0, };
|
OstreeRepoCheckoutAtOptions options = { 0, };
|
||||||
|
|
||||||
|
|
@ -112,6 +114,18 @@ process_one_checkout (OstreeRepo *repo,
|
||||||
"Cannot specify both --union and --union-add");
|
"Cannot specify both --union and --union-add");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
if (opt_union && opt_union_identical)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"Cannot specify both --union and --union-identical");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (opt_union_add && opt_union_identical)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"Cannot specify both --union-add and --union-identical ");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
if (opt_require_hardlinks && opt_force_copy)
|
if (opt_require_hardlinks && opt_force_copy)
|
||||||
{
|
{
|
||||||
glnx_throw (error, "Cannot specify both --require-hardlinks and --force-copy");
|
glnx_throw (error, "Cannot specify both --require-hardlinks and --force-copy");
|
||||||
|
|
@ -121,6 +135,16 @@ process_one_checkout (OstreeRepo *repo,
|
||||||
options.overwrite_mode = OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES;
|
options.overwrite_mode = OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_FILES;
|
||||||
else if (opt_union_add)
|
else if (opt_union_add)
|
||||||
options.overwrite_mode = OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES;
|
options.overwrite_mode = OSTREE_REPO_CHECKOUT_OVERWRITE_ADD_FILES;
|
||||||
|
else if (opt_union_identical)
|
||||||
|
{
|
||||||
|
if (!opt_require_hardlinks)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"--union-identical requires --require-hardlinks");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
options.overwrite_mode = OSTREE_REPO_CHECKOUT_OVERWRITE_UNION_IDENTICAL;
|
||||||
|
}
|
||||||
if (opt_whiteouts)
|
if (opt_whiteouts)
|
||||||
options.process_whiteouts = TRUE;
|
options.process_whiteouts = TRUE;
|
||||||
if (subpath)
|
if (subpath)
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
#include "ot-tool-util.h"
|
#include "ot-tool-util.h"
|
||||||
#include "parse-datetime.h"
|
#include "parse-datetime.h"
|
||||||
#include "ostree-repo-private.h"
|
#include "ostree-repo-private.h"
|
||||||
|
#include "ostree-libarchive-private.h"
|
||||||
|
|
||||||
static char *opt_subject;
|
static char *opt_subject;
|
||||||
static char *opt_body;
|
static char *opt_body;
|
||||||
|
|
@ -46,7 +47,9 @@ static char **opt_detached_metadata_strings;
|
||||||
static gboolean opt_link_checkout_speedup;
|
static gboolean opt_link_checkout_speedup;
|
||||||
static gboolean opt_skip_if_unchanged;
|
static gboolean opt_skip_if_unchanged;
|
||||||
static gboolean opt_tar_autocreate_parents;
|
static gboolean opt_tar_autocreate_parents;
|
||||||
|
static char *opt_tar_pathname_filter;
|
||||||
static gboolean opt_no_xattrs;
|
static gboolean opt_no_xattrs;
|
||||||
|
static char *opt_selinux_policy;
|
||||||
static gboolean opt_canonical_permissions;
|
static gboolean opt_canonical_permissions;
|
||||||
static char **opt_trees;
|
static char **opt_trees;
|
||||||
static gint opt_owner_uid = -1;
|
static gint opt_owner_uid = -1;
|
||||||
|
|
@ -93,8 +96,10 @@ static GOptionEntry options[] = {
|
||||||
{ "owner-gid", 0, 0, G_OPTION_ARG_INT, &opt_owner_gid, "Set file ownership group id", "GID" },
|
{ "owner-gid", 0, 0, G_OPTION_ARG_INT, &opt_owner_gid, "Set file ownership group id", "GID" },
|
||||||
{ "canonical-permissions", 0, 0, G_OPTION_ARG_NONE, &opt_canonical_permissions, "Canonicalize permissions in the same way bare-user does for hardlinked files", NULL },
|
{ "canonical-permissions", 0, 0, G_OPTION_ARG_NONE, &opt_canonical_permissions, "Canonicalize permissions in the same way bare-user does for hardlinked files", NULL },
|
||||||
{ "no-xattrs", 0, 0, G_OPTION_ARG_NONE, &opt_no_xattrs, "Do not import extended attributes", NULL },
|
{ "no-xattrs", 0, 0, G_OPTION_ARG_NONE, &opt_no_xattrs, "Do not import extended attributes", NULL },
|
||||||
|
{ "selinux-policy", 0, 0, G_OPTION_ARG_FILENAME, &opt_selinux_policy, "Set SELinux labels based on policy in root filesystem PATH (may be /)", "PATH" },
|
||||||
{ "link-checkout-speedup", 0, 0, G_OPTION_ARG_NONE, &opt_link_checkout_speedup, "Optimize for commits of trees composed of hardlinks into the repository", NULL },
|
{ "link-checkout-speedup", 0, 0, G_OPTION_ARG_NONE, &opt_link_checkout_speedup, "Optimize for commits of trees composed of hardlinks into the repository", NULL },
|
||||||
{ "tar-autocreate-parents", 0, 0, G_OPTION_ARG_NONE, &opt_tar_autocreate_parents, "When loading tar archives, automatically create parent directories as needed", NULL },
|
{ "tar-autocreate-parents", 0, 0, G_OPTION_ARG_NONE, &opt_tar_autocreate_parents, "When loading tar archives, automatically create parent directories as needed", NULL },
|
||||||
|
{ "tar-pathname-filter", 0, 0, G_OPTION_ARG_STRING, &opt_tar_pathname_filter, "When loading tar archives, use REGEX,REPLACEMENT against path names", "REGEX,REPLACEMENT" },
|
||||||
{ "skip-if-unchanged", 0, 0, G_OPTION_ARG_NONE, &opt_skip_if_unchanged, "If the contents are unchanged from previous commit, do nothing", NULL },
|
{ "skip-if-unchanged", 0, 0, G_OPTION_ARG_NONE, &opt_skip_if_unchanged, "If the contents are unchanged from previous commit, do nothing", NULL },
|
||||||
{ "statoverride", 0, 0, G_OPTION_ARG_FILENAME, &opt_statoverride_file, "File containing list of modifications to make to permissions", "PATH" },
|
{ "statoverride", 0, 0, G_OPTION_ARG_FILENAME, &opt_statoverride_file, "File containing list of modifications to make to permissions", "PATH" },
|
||||||
{ "skip-list", 0, 0, G_OPTION_ARG_FILENAME, &opt_skiplist_file, "File containing list of files to skip", "PATH" },
|
{ "skip-list", 0, 0, G_OPTION_ARG_FILENAME, &opt_skiplist_file, "File containing list of files to skip", "PATH" },
|
||||||
|
|
@ -219,6 +224,28 @@ commit_filter (OstreeRepo *self,
|
||||||
return OSTREE_REPO_COMMIT_FILTER_ALLOW;
|
return OSTREE_REPO_COMMIT_FILTER_ALLOW;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
GRegex *regex;
|
||||||
|
const char *replacement;
|
||||||
|
} TranslatePathnameData;
|
||||||
|
|
||||||
|
/* Implement --tar-pathname-filter */
|
||||||
|
static char *
|
||||||
|
handle_translate_pathname (OstreeRepo *repo,
|
||||||
|
const struct stat *stbuf,
|
||||||
|
const char *path,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
TranslatePathnameData *tpdata = user_data;
|
||||||
|
g_autoptr(GError) tmp_error = NULL;
|
||||||
|
char *ret =
|
||||||
|
g_regex_replace (tpdata->regex, path, -1, 0,
|
||||||
|
tpdata->replacement, 0, &tmp_error);
|
||||||
|
g_assert_no_error (tmp_error);
|
||||||
|
g_assert (ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
commit_editor (OstreeRepo *repo,
|
commit_editor (OstreeRepo *repo,
|
||||||
const char *branch,
|
const char *branch,
|
||||||
|
|
@ -395,6 +422,7 @@ ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError
|
||||||
g_autoptr(GHashTable) mode_overrides = NULL;
|
g_autoptr(GHashTable) mode_overrides = NULL;
|
||||||
g_autoptr(GHashTable) skip_list = NULL;
|
g_autoptr(GHashTable) skip_list = NULL;
|
||||||
OstreeRepoCommitModifierFlags flags = 0;
|
OstreeRepoCommitModifierFlags flags = 0;
|
||||||
|
g_autoptr(OstreeSePolicy) policy = NULL;
|
||||||
OstreeRepoCommitModifier *modifier = NULL;
|
OstreeRepoCommitModifier *modifier = NULL;
|
||||||
OstreeRepoTransactionStats stats;
|
OstreeRepoTransactionStats stats;
|
||||||
struct CommitFilterData filter_data = { 0, };
|
struct CommitFilterData filter_data = { 0, };
|
||||||
|
|
@ -459,12 +487,26 @@ ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError
|
||||||
|| opt_owner_gid >= 0
|
|| opt_owner_gid >= 0
|
||||||
|| opt_statoverride_file != NULL
|
|| opt_statoverride_file != NULL
|
||||||
|| opt_skiplist_file != NULL
|
|| opt_skiplist_file != NULL
|
||||||
|| opt_no_xattrs)
|
|| opt_no_xattrs
|
||||||
|
|| opt_selinux_policy)
|
||||||
{
|
{
|
||||||
filter_data.mode_adds = mode_adds;
|
filter_data.mode_adds = mode_adds;
|
||||||
filter_data.skip_list = skip_list;
|
filter_data.skip_list = skip_list;
|
||||||
modifier = ostree_repo_commit_modifier_new (flags, commit_filter,
|
modifier = ostree_repo_commit_modifier_new (flags, commit_filter,
|
||||||
&filter_data, NULL);
|
&filter_data, NULL);
|
||||||
|
if (opt_selinux_policy)
|
||||||
|
{
|
||||||
|
glnx_fd_close int rootfs_dfd = -1;
|
||||||
|
if (!glnx_opendirat (AT_FDCWD, opt_selinux_policy, TRUE, &rootfs_dfd, error))
|
||||||
|
{
|
||||||
|
g_prefix_error (error, "selinux-policy: ");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
policy = ostree_sepolicy_new_at (rootfs_dfd, cancellable, error);
|
||||||
|
if (!policy)
|
||||||
|
goto out;
|
||||||
|
ostree_repo_commit_modifier_set_sepolicy (modifier, policy);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt_parent)
|
if (opt_parent)
|
||||||
|
|
@ -550,6 +592,8 @@ ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
else if (strcmp (tree_type, "tar") == 0)
|
else if (strcmp (tree_type, "tar") == 0)
|
||||||
|
{
|
||||||
|
if (!opt_tar_pathname_filter)
|
||||||
{
|
{
|
||||||
object_to_commit = g_file_new_for_path (tree);
|
object_to_commit = g_file_new_for_path (tree);
|
||||||
if (!ostree_repo_write_archive_to_mtree (repo, object_to_commit, mtree, modifier,
|
if (!ostree_repo_write_archive_to_mtree (repo, object_to_commit, mtree, modifier,
|
||||||
|
|
@ -557,6 +601,43 @@ ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef HAVE_LIBARCHIVE
|
||||||
|
const char *comma = strchr (opt_tar_pathname_filter, ',');
|
||||||
|
if (!comma)
|
||||||
|
{
|
||||||
|
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
|
"Missing ',' in --tar-pathname-filter");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
const char *replacement = comma + 1;
|
||||||
|
g_autofree char *regexp_text = g_strndup (opt_tar_pathname_filter, comma - opt_tar_pathname_filter);
|
||||||
|
/* Use new API if we have a pathname filter */
|
||||||
|
OstreeRepoImportArchiveOptions opts = { 0, };
|
||||||
|
opts.autocreate_parents = opt_tar_autocreate_parents;
|
||||||
|
opts.translate_pathname = handle_translate_pathname;
|
||||||
|
g_autoptr(GRegex) regexp = g_regex_new (regexp_text, 0, 0, error);
|
||||||
|
TranslatePathnameData tpdata = { regexp, replacement };
|
||||||
|
if (!regexp)
|
||||||
|
{
|
||||||
|
g_prefix_error (error, "--tar-pathname-filter: ");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
opts.translate_pathname_user_data = &tpdata;
|
||||||
|
g_autoptr(OtAutoArchiveRead) archive = ot_open_archive_read (tree, error);
|
||||||
|
if (!archive)
|
||||||
|
goto out;
|
||||||
|
if (!ostree_repo_import_archive_to_mtree (repo, &opts, archive, mtree,
|
||||||
|
modifier, cancellable, error))
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||||
|
"This version of ostree is not compiled with libarchive support");
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
else if (strcmp (tree_type, "ref") == 0)
|
else if (strcmp (tree_type, "ref") == 0)
|
||||||
{
|
{
|
||||||
if (!ostree_repo_read_commit (repo, tree, &object_to_commit, NULL, cancellable, error))
|
if (!ostree_repo_read_commit (repo, tree, &object_to_commit, NULL, cancellable, error))
|
||||||
|
|
@ -699,7 +780,7 @@ ostree_builtin_commit (int argc, char **argv, GCancellable *cancellable, GError
|
||||||
if (!ostree_repo_commit_transaction (repo, &stats, cancellable, error))
|
if (!ostree_repo_commit_transaction (repo, &stats, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* The default for this option is FALSE, even for archive-z2 repos,
|
/* The default for this option is FALSE, even for archive repos,
|
||||||
* because ostree supports multiple processes committing to the same
|
* because ostree supports multiple processes committing to the same
|
||||||
* repo (but different refs) concurrently, and in fact gnome-continuous
|
* repo (but different refs) concurrently, and in fact gnome-continuous
|
||||||
* actually does this. In that context it's best to update the summary
|
* actually does this. In that context it's best to update the summary
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ ostree_builtin_config (int argc, char **argv, GCancellable *cancellable, GError
|
||||||
g_autofree char *key = NULL;
|
g_autofree char *key = NULL;
|
||||||
GKeyFile *config = NULL;
|
GKeyFile *config = NULL;
|
||||||
|
|
||||||
context = g_option_context_new ("- Change configuration settings");
|
context = g_option_context_new ("(get KEY|set KEY VALUE) - Change repo configuration settings");
|
||||||
|
|
||||||
if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
||||||
|
|
@ -252,6 +252,7 @@ ostree_builtin_fsck (int argc, char **argv, GCancellable *cancellable, GError **
|
||||||
|
|
||||||
g_autoptr(GHashTable) all_collection_refs = NULL; /* (element-type OstreeCollectionRef utf8) */
|
g_autoptr(GHashTable) all_collection_refs = NULL; /* (element-type OstreeCollectionRef utf8) */
|
||||||
if (!ostree_repo_list_collection_refs (repo, NULL, &all_collection_refs,
|
if (!ostree_repo_list_collection_refs (repo, NULL, &all_collection_refs,
|
||||||
|
OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ static char *opt_collection_id = NULL;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static GOptionEntry options[] = {
|
static GOptionEntry options[] = {
|
||||||
{ "mode", 0, 0, G_OPTION_ARG_STRING, &opt_mode, "Initialize repository in given mode (bare, archive-z2)", NULL },
|
{ "mode", 0, 0, G_OPTION_ARG_STRING, &opt_mode, "Initialize repository in given mode (bare, archive)", NULL },
|
||||||
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
||||||
{ "collection-id", 0, 0, G_OPTION_ARG_STRING, &opt_collection_id,
|
{ "collection-id", 0, 0, G_OPTION_ARG_STRING, &opt_collection_id,
|
||||||
"Globally unique ID for this repository as an collection of refs for redistribution to other repositories", "COLLECTION-ID" },
|
"Globally unique ID for this repository as an collection of refs for redistribution to other repositories", "COLLECTION-ID" },
|
||||||
|
|
|
||||||
|
|
@ -59,57 +59,40 @@ delete_commit (OstreeRepo *repo, const char *commit_to_delete, GCancellable *can
|
||||||
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
||||||
g_autoptr(GHashTable) collection_refs = NULL; /* (element-type OstreeCollectionRef utf8) */
|
g_autoptr(GHashTable) collection_refs = NULL; /* (element-type OstreeCollectionRef utf8) */
|
||||||
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
||||||
GHashTableIter hashiter;
|
|
||||||
gpointer hashkey, hashvalue;
|
|
||||||
gboolean ret = FALSE;
|
|
||||||
|
|
||||||
/* Check refs which are not in a collection. */
|
/* Check refs which are not in a collection. */
|
||||||
if (!ostree_repo_list_refs (repo, NULL, &refs, cancellable, error))
|
if (!ostree_repo_list_refs (repo, NULL, &refs, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
g_hash_table_iter_init (&hashiter, refs);
|
GLNX_HASH_TABLE_FOREACH_KV(refs, const char *, ref, const char *, commit)
|
||||||
while (g_hash_table_iter_next (&hashiter, &hashkey, &hashvalue))
|
|
||||||
{
|
{
|
||||||
const char *ref = hashkey;
|
|
||||||
const char *commit = hashvalue;
|
|
||||||
if (g_strcmp0 (commit_to_delete, commit) == 0)
|
if (g_strcmp0 (commit_to_delete, commit) == 0)
|
||||||
{
|
return glnx_throw (error, "Commit '%s' is referenced by '%s'", commit_to_delete, ref);
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Commit '%s' is referenced by '%s'", commit_to_delete, ref);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
||||||
/* And check refs which *are* in a collection. */
|
/* And check refs which *are* in a collection. */
|
||||||
if (!ostree_repo_list_collection_refs (repo, NULL, &collection_refs, cancellable, error))
|
if (!ostree_repo_list_collection_refs (repo, NULL, &collection_refs,
|
||||||
goto out;
|
OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES,
|
||||||
|
cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
g_hash_table_iter_init (&hashiter, collection_refs);
|
GLNX_HASH_TABLE_FOREACH_KV (collection_refs, const OstreeCollectionRef*, ref,
|
||||||
while (g_hash_table_iter_next (&hashiter, &hashkey, &hashvalue))
|
const char *, commit)
|
||||||
{
|
{
|
||||||
const OstreeCollectionRef *ref = hashkey;
|
|
||||||
const char *commit = hashvalue;
|
|
||||||
if (g_strcmp0 (commit_to_delete, commit) == 0)
|
if (g_strcmp0 (commit_to_delete, commit) == 0)
|
||||||
{
|
return glnx_throw (error, "Commit '%s' is referenced by (%s, %s)",
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Commit '%s' is referenced by (%s, %s)",
|
|
||||||
commit_to_delete, ref->collection_id, ref->ref_name);
|
commit_to_delete, ref->collection_id, ref->ref_name);
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
||||||
|
|
||||||
if (!ot_enable_tombstone_commits (repo, error))
|
if (!ot_enable_tombstone_commits (repo, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!ostree_repo_delete_object (repo, OSTREE_OBJECT_TYPE_COMMIT, commit_to_delete, cancellable, error))
|
if (!ostree_repo_delete_object (repo, OSTREE_OBJECT_TYPE_COMMIT, commit_to_delete, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
@ -119,7 +102,6 @@ traverse_keep_younger_than (OstreeRepo *repo, const char *checksum,
|
||||||
GCancellable *cancellable, GError **error)
|
GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
g_autofree char *next_checksum = g_strdup (checksum);
|
g_autofree char *next_checksum = g_strdup (checksum);
|
||||||
g_autoptr(GVariant) commit = NULL;
|
|
||||||
|
|
||||||
/* This is the first commit in our loop, which has a ref pointing to it. We
|
/* This is the first commit in our loop, which has a ref pointing to it. We
|
||||||
* don't want to auto-prune it.
|
* don't want to auto-prune it.
|
||||||
|
|
@ -130,16 +112,14 @@ traverse_keep_younger_than (OstreeRepo *repo, const char *checksum,
|
||||||
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
guint64 commit_timestamp;
|
g_autoptr(GVariant) commit = NULL;
|
||||||
|
|
||||||
if (!ostree_repo_load_variant_if_exists (repo, OSTREE_OBJECT_TYPE_COMMIT, next_checksum,
|
if (!ostree_repo_load_variant_if_exists (repo, OSTREE_OBJECT_TYPE_COMMIT, next_checksum,
|
||||||
&commit, error))
|
&commit, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!commit)
|
if (!commit)
|
||||||
break; /* This commit was pruned, so we're done */
|
break; /* This commit was pruned, so we're done */
|
||||||
|
|
||||||
commit_timestamp = ostree_commit_get_timestamp (commit);
|
guint64 commit_timestamp = ostree_commit_get_timestamp (commit);
|
||||||
/* Is this commit newer than our --keep-younger-than spec? */
|
/* Is this commit newer than our --keep-younger-than spec? */
|
||||||
if (commit_timestamp >= ts->tv_sec)
|
if (commit_timestamp >= ts->tv_sec)
|
||||||
{
|
{
|
||||||
|
|
@ -165,22 +145,13 @@ traverse_keep_younger_than (OstreeRepo *repo, const char *checksum,
|
||||||
gboolean
|
gboolean
|
||||||
ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError **error)
|
ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
g_autoptr(GOptionContext) context = g_option_context_new ("- Search for unreachable objects");
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
|
||||||
g_autoptr(OstreeRepo) repo = NULL;
|
g_autoptr(OstreeRepo) repo = NULL;
|
||||||
g_autofree char *formatted_freed_size = NULL;
|
|
||||||
OstreeRepoPruneFlags pruneflags = 0;
|
|
||||||
gint n_objects_total;
|
|
||||||
gint n_objects_pruned;
|
|
||||||
guint64 objsize_total;
|
|
||||||
|
|
||||||
context = g_option_context_new ("- Search for unreachable objects");
|
|
||||||
|
|
||||||
if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
if (!ostree_option_context_parse (context, options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!opt_no_prune && !ostree_ensure_repo_writable (repo, error))
|
if (!opt_no_prune && !ostree_ensure_repo_writable (repo, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
/* Special handling for explicit commit deletion here - we do this
|
/* Special handling for explicit commit deletion here - we do this
|
||||||
* first.
|
* first.
|
||||||
|
|
@ -190,17 +161,18 @@ ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError *
|
||||||
if (opt_no_prune)
|
if (opt_no_prune)
|
||||||
{
|
{
|
||||||
ot_util_usage_error (context, "Cannot specify both --delete-commit and --no-prune", error);
|
ot_util_usage_error (context, "Cannot specify both --delete-commit and --no-prune", error);
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (opt_static_deltas_only)
|
if (opt_static_deltas_only)
|
||||||
{
|
{
|
||||||
if(!ostree_repo_prune_static_deltas (repo, opt_delete_commit, cancellable, error))
|
if(!ostree_repo_prune_static_deltas (repo, opt_delete_commit, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else if (!delete_commit (repo, opt_delete_commit, cancellable, error))
|
else if (!delete_commit (repo, opt_delete_commit, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OstreeRepoPruneFlags pruneflags = 0;
|
||||||
if (opt_refs_only)
|
if (opt_refs_only)
|
||||||
pruneflags |= OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY;
|
pruneflags |= OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY;
|
||||||
if (opt_no_prune)
|
if (opt_no_prune)
|
||||||
|
|
@ -210,12 +182,15 @@ ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError *
|
||||||
* prune API - both to avoid code duplication, and to keep it run from the
|
* prune API - both to avoid code duplication, and to keep it run from the
|
||||||
* test suite.
|
* test suite.
|
||||||
*/
|
*/
|
||||||
|
gint n_objects_total;
|
||||||
|
gint n_objects_pruned;
|
||||||
|
guint64 objsize_total;
|
||||||
if (!(opt_retain_branch_depth || opt_keep_younger_than))
|
if (!(opt_retain_branch_depth || opt_keep_younger_than))
|
||||||
{
|
{
|
||||||
if (!ostree_repo_prune (repo, pruneflags, opt_depth,
|
if (!ostree_repo_prune (repo, pruneflags, opt_depth,
|
||||||
&n_objects_total, &n_objects_pruned, &objsize_total,
|
&n_objects_total, &n_objects_pruned, &objsize_total,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -232,11 +207,7 @@ ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError *
|
||||||
if (opt_keep_younger_than)
|
if (opt_keep_younger_than)
|
||||||
{
|
{
|
||||||
if (!parse_datetime (&keep_younger_than_ts, opt_keep_younger_than, NULL))
|
if (!parse_datetime (&keep_younger_than_ts, opt_keep_younger_than, NULL))
|
||||||
{
|
return glnx_throw (error, "Could not parse '%s'", opt_keep_younger_than);
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Could not parse '%s'", opt_keep_younger_than);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (char **iter = opt_retain_branch_depth; iter && *iter; iter++)
|
for (char **iter = opt_retain_branch_depth; iter && *iter; iter++)
|
||||||
|
|
@ -244,34 +215,19 @@ ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError *
|
||||||
/* bd should look like BRANCH=DEPTH where DEPTH is an int */
|
/* bd should look like BRANCH=DEPTH where DEPTH is an int */
|
||||||
const char *bd = *iter;
|
const char *bd = *iter;
|
||||||
const char *eq = strchr (bd, '=');
|
const char *eq = strchr (bd, '=');
|
||||||
const char *depthstr;
|
|
||||||
gint64 depth;
|
|
||||||
char *endptr;
|
|
||||||
|
|
||||||
if (!eq)
|
if (!eq)
|
||||||
{
|
return glnx_throw (error, "Invalid value %s, must specify BRANCH=DEPTH", bd);
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Invalid value %s, must specify BRANCH=DEPTH",
|
const char *depthstr = eq + 1;
|
||||||
bd);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
depthstr = eq + 1;
|
|
||||||
errno = EPERM;
|
errno = EPERM;
|
||||||
depth = g_ascii_strtoll (depthstr, &endptr, 10);
|
char *endptr;
|
||||||
|
gint64 depth = g_ascii_strtoll (depthstr, &endptr, 10);
|
||||||
if (depth == 0)
|
if (depth == 0)
|
||||||
{
|
{
|
||||||
if (errno == EINVAL)
|
if (errno == EINVAL)
|
||||||
{
|
return glnx_throw (error, "Out of range depth %s", depthstr);
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Out of range depth %s", depthstr);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
else if (endptr == depthstr)
|
else if (endptr == depthstr)
|
||||||
{
|
return glnx_throw (error, "Invalid depth %s", depthstr);
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
|
||||||
"Invalid depth %s", depthstr);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
g_hash_table_insert (retain_branch_depth, g_strndup (bd, eq - bd),
|
g_hash_table_insert (retain_branch_depth, g_strndup (bd, eq - bd),
|
||||||
GINT_TO_POINTER ((int)depth));
|
GINT_TO_POINTER ((int)depth));
|
||||||
|
|
@ -302,7 +258,7 @@ ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError *
|
||||||
&keep_younger_than_ts,
|
&keep_younger_than_ts,
|
||||||
reachable,
|
reachable,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
/* Okay, we handled the younger-than case; the other
|
/* Okay, we handled the younger-than case; the other
|
||||||
* two fall through to plain depth-based handling below.
|
* two fall through to plain depth-based handling below.
|
||||||
|
|
@ -325,12 +281,11 @@ ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError *
|
||||||
&n_objects_pruned,
|
&n_objects_pruned,
|
||||||
&objsize_total,
|
&objsize_total,
|
||||||
cancellable, error))
|
cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
formatted_freed_size = g_format_size_full (objsize_total, 0);
|
g_autofree char *formatted_freed_size = g_format_size_full (objsize_total, 0);
|
||||||
|
|
||||||
g_print ("Total objects: %u\n", n_objects_total);
|
g_print ("Total objects: %u\n", n_objects_total);
|
||||||
if (n_objects_pruned == 0)
|
if (n_objects_pruned == 0)
|
||||||
g_print ("No unreachable objects\n");
|
g_print ("No unreachable objects\n");
|
||||||
|
|
@ -341,7 +296,5 @@ ostree_builtin_prune (int argc, char **argv, GCancellable *cancellable, GError *
|
||||||
g_print ("Deleted %u objects, %s freed\n",
|
g_print ("Deleted %u objects, %s freed\n",
|
||||||
n_objects_pruned, formatted_freed_size);
|
n_objects_pruned, formatted_freed_size);
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ static int opt_depth = 0;
|
||||||
static GOptionEntry options[] = {
|
static GOptionEntry options[] = {
|
||||||
{ "remote", 0, 0, G_OPTION_ARG_STRING, &opt_remote, "Add REMOTE to refspec", "REMOTE" },
|
{ "remote", 0, 0, G_OPTION_ARG_STRING, &opt_remote, "Add REMOTE to refspec", "REMOTE" },
|
||||||
{ "disable-fsync", 0, 0, G_OPTION_ARG_NONE, &opt_disable_fsync, "Do not invoke fsync()", NULL },
|
{ "disable-fsync", 0, 0, G_OPTION_ARG_NONE, &opt_disable_fsync, "Do not invoke fsync()", NULL },
|
||||||
{ "untrusted", 0, 0, G_OPTION_ARG_NONE, &opt_untrusted, "Do not trust source", NULL },
|
{ "untrusted", 0, 0, G_OPTION_ARG_NONE, &opt_untrusted, "Do not verify checksums of local sources (always enabled for HTTP pulls)", NULL },
|
||||||
{ "bareuseronly-files", 0, 0, G_OPTION_ARG_NONE, &opt_bareuseronly_files, "Reject regular files with mode outside of 0775 (world writable, suid, etc.)", NULL },
|
{ "bareuseronly-files", 0, 0, G_OPTION_ARG_NONE, &opt_bareuseronly_files, "Reject regular files with mode outside of 0775 (world writable, suid, etc.)", NULL },
|
||||||
{ "require-static-deltas", 0, 0, G_OPTION_ARG_NONE, &opt_require_static_deltas, "Require static deltas", NULL },
|
{ "require-static-deltas", 0, 0, G_OPTION_ARG_NONE, &opt_require_static_deltas, "Require static deltas", NULL },
|
||||||
{ "gpg-verify", 0, 0, G_OPTION_ARG_NONE, &opt_gpg_verify, "GPG verify commits (must specify --remote)", NULL },
|
{ "gpg-verify", 0, 0, G_OPTION_ARG_NONE, &opt_gpg_verify, "GPG verify commits (must specify --remote)", NULL },
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ static gboolean opt_dry_run;
|
||||||
static gboolean opt_disable_static_deltas;
|
static gboolean opt_disable_static_deltas;
|
||||||
static gboolean opt_require_static_deltas;
|
static gboolean opt_require_static_deltas;
|
||||||
static gboolean opt_untrusted;
|
static gboolean opt_untrusted;
|
||||||
|
static gboolean opt_timestamp_check;
|
||||||
static gboolean opt_bareuseronly_files;
|
static gboolean opt_bareuseronly_files;
|
||||||
static char** opt_subpaths;
|
static char** opt_subpaths;
|
||||||
static char** opt_http_headers;
|
static char** opt_http_headers;
|
||||||
|
|
@ -54,9 +55,9 @@ static GOptionEntry options[] = {
|
||||||
{ "disable-fsync", 0, 0, G_OPTION_ARG_NONE, &opt_disable_fsync, "Do not invoke fsync()", NULL },
|
{ "disable-fsync", 0, 0, G_OPTION_ARG_NONE, &opt_disable_fsync, "Do not invoke fsync()", NULL },
|
||||||
{ "disable-static-deltas", 0, 0, G_OPTION_ARG_NONE, &opt_disable_static_deltas, "Do not use static deltas", NULL },
|
{ "disable-static-deltas", 0, 0, G_OPTION_ARG_NONE, &opt_disable_static_deltas, "Do not use static deltas", NULL },
|
||||||
{ "require-static-deltas", 0, 0, G_OPTION_ARG_NONE, &opt_require_static_deltas, "Require static deltas", NULL },
|
{ "require-static-deltas", 0, 0, G_OPTION_ARG_NONE, &opt_require_static_deltas, "Require static deltas", NULL },
|
||||||
{ "mirror", 0, 0, G_OPTION_ARG_NONE, &opt_mirror, "Write refs suitable for a mirror", NULL },
|
{ "mirror", 0, 0, G_OPTION_ARG_NONE, &opt_mirror, "Write refs suitable for a mirror and fetches all refs if none provided", NULL },
|
||||||
{ "subpath", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &opt_subpaths, "Only pull the provided subpath(s)", NULL },
|
{ "subpath", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &opt_subpaths, "Only pull the provided subpath(s)", NULL },
|
||||||
{ "untrusted", 0, 0, G_OPTION_ARG_NONE, &opt_untrusted, "Do not trust (local) sources", NULL },
|
{ "untrusted", 0, 0, G_OPTION_ARG_NONE, &opt_untrusted, "Do not verify checksums of local sources (always enabled for HTTP pulls)", NULL },
|
||||||
{ "bareuseronly-files", 0, 0, G_OPTION_ARG_NONE, &opt_bareuseronly_files, "Reject regular files with mode outside of 0775 (world writable, suid, etc.)", NULL },
|
{ "bareuseronly-files", 0, 0, G_OPTION_ARG_NONE, &opt_bareuseronly_files, "Reject regular files with mode outside of 0775 (world writable, suid, etc.)", NULL },
|
||||||
{ "dry-run", 0, 0, G_OPTION_ARG_NONE, &opt_dry_run, "Only print information on what will be downloaded (requires static deltas)", NULL },
|
{ "dry-run", 0, 0, G_OPTION_ARG_NONE, &opt_dry_run, "Only print information on what will be downloaded (requires static deltas)", NULL },
|
||||||
{ "depth", 0, 0, G_OPTION_ARG_INT, &opt_depth, "Traverse DEPTH parents (-1=infinite) (default: 0)", "DEPTH" },
|
{ "depth", 0, 0, G_OPTION_ARG_INT, &opt_depth, "Traverse DEPTH parents (-1=infinite) (default: 0)", "DEPTH" },
|
||||||
|
|
@ -64,6 +65,7 @@ static GOptionEntry options[] = {
|
||||||
{ "http-header", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_http_headers, "Add NAME=VALUE as HTTP header to all requests", "NAME=VALUE" },
|
{ "http-header", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_http_headers, "Add NAME=VALUE as HTTP header to all requests", "NAME=VALUE" },
|
||||||
{ "update-frequency", 0, 0, G_OPTION_ARG_INT, &opt_frequency, "Sets the update frequency, in milliseconds (0=1000ms) (default: 0)", "FREQUENCY" },
|
{ "update-frequency", 0, 0, G_OPTION_ARG_INT, &opt_frequency, "Sets the update frequency, in milliseconds (0=1000ms) (default: 0)", "FREQUENCY" },
|
||||||
{ "localcache-repo", 'L', 0, G_OPTION_ARG_FILENAME_ARRAY, &opt_localcache_repos, "Add REPO as local cache source for objects during this pull", "REPO" },
|
{ "localcache-repo", 'L', 0, G_OPTION_ARG_FILENAME_ARRAY, &opt_localcache_repos, "Add REPO as local cache source for objects during this pull", "REPO" },
|
||||||
|
{ "timestamp-check", 'T', 0, G_OPTION_ARG_NONE, &opt_timestamp_check, "Require fetched commits to have newer timestamps", NULL },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -288,6 +290,9 @@ ostree_builtin_pull (int argc, char **argv, GCancellable *cancellable, GError **
|
||||||
|
|
||||||
g_variant_builder_add (&builder, "{s@v}", "dry-run",
|
g_variant_builder_add (&builder, "{s@v}", "dry-run",
|
||||||
g_variant_new_variant (g_variant_new_boolean (opt_dry_run)));
|
g_variant_new_variant (g_variant_new_boolean (opt_dry_run)));
|
||||||
|
if (opt_timestamp_check)
|
||||||
|
g_variant_builder_add (&builder, "{s@v}", "timestamp-check",
|
||||||
|
g_variant_new_variant (g_variant_new_boolean (opt_timestamp_check)));
|
||||||
|
|
||||||
if (override_commit_ids)
|
if (override_commit_ids)
|
||||||
g_variant_builder_add (&builder, "{s@v}", "override-commit-ids",
|
g_variant_builder_add (&builder, "{s@v}", "override-commit-ids",
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,8 @@ do_ref_with_collections (OstreeRepo *repo,
|
||||||
|
|
||||||
if (!ostree_repo_list_collection_refs (repo,
|
if (!ostree_repo_list_collection_refs (repo,
|
||||||
(!opt_create) ? refspec_prefix : NULL,
|
(!opt_create) ? refspec_prefix : NULL,
|
||||||
&refs, cancellable, error))
|
&refs, OSTREE_REPO_LIST_REFS_EXT_NONE,
|
||||||
|
cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!opt_delete && !opt_create)
|
if (!opt_delete && !opt_create)
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,8 @@ ostree_builtin_remote (int argc, char **argv, GCancellable *cancellable, GError
|
||||||
|
|
||||||
/* This will not return for some options (e.g. --version). */
|
/* This will not return for some options (e.g. --version). */
|
||||||
if (ostree_option_context_parse (context, NULL, &argc, &argv,
|
if (ostree_option_context_parse (context, NULL, &argc, &argv,
|
||||||
OSTREE_BUILTIN_FLAG_NONE, NULL, cancellable, error))
|
OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable,
|
||||||
|
error))
|
||||||
{
|
{
|
||||||
if (subcommand_name == NULL)
|
if (subcommand_name == NULL)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -100,48 +100,41 @@ static_delta_usage (char **argv,
|
||||||
else
|
else
|
||||||
print_func = g_print;
|
print_func = g_print;
|
||||||
|
|
||||||
print_func ("usage: ostree static-delta\n");
|
print_func ("Usage:\n");
|
||||||
print_func ("Builtin commands:\n");
|
print_func (" ostree static-delta [OPTION...] COMMAND\n\n");
|
||||||
|
print_func ("Builtin \"static-delta\" Commands:\n");
|
||||||
|
|
||||||
while (command->name)
|
while (command->name)
|
||||||
{
|
{
|
||||||
print_func (" %s\n", command->name);
|
print_func (" %s\n", command->name);
|
||||||
command++;
|
command++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
print_func ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
ot_static_delta_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error)
|
ot_static_delta_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
g_autoptr(GPtrArray) delta_names = NULL;
|
|
||||||
guint i;
|
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
|
||||||
g_autoptr(OstreeRepo) repo = NULL;
|
g_autoptr(OstreeRepo) repo = NULL;
|
||||||
|
g_autoptr(GOptionContext) context = g_option_context_new ("- list static delta files");
|
||||||
|
if (!ostree_option_context_parse (context, list_options, &argc, &argv,
|
||||||
|
OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
context = g_option_context_new ("LIST - list static delta files");
|
g_autoptr(GPtrArray) delta_names = NULL;
|
||||||
|
|
||||||
if (!ostree_option_context_parse (context, list_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (!ostree_repo_list_static_delta_names (repo, &delta_names, cancellable, error))
|
if (!ostree_repo_list_static_delta_names (repo, &delta_names, cancellable, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (delta_names->len == 0)
|
if (delta_names->len == 0)
|
||||||
{
|
|
||||||
g_print ("(No static deltas)\n");
|
g_print ("(No static deltas)\n");
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (i = 0; i < delta_names->len; i++)
|
for (guint i = 0; i < delta_names->len; i++)
|
||||||
{
|
|
||||||
g_print ("%s\n", (char*)delta_names->pdata[i]);
|
g_print ("%s\n", (char*)delta_names->pdata[i]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
@ -152,7 +145,7 @@ ot_static_delta_builtin_show (int argc, char **argv, GCancellable *cancellable,
|
||||||
g_autoptr(OstreeRepo) repo = NULL;
|
g_autoptr(OstreeRepo) repo = NULL;
|
||||||
const char *delta_id = NULL;
|
const char *delta_id = NULL;
|
||||||
|
|
||||||
context = g_option_context_new ("SHOW - Dump information on a delta");
|
context = g_option_context_new ("- Dump information on a delta");
|
||||||
|
|
||||||
if (!ostree_option_context_parse (context, list_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
if (!ostree_option_context_parse (context, list_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -182,7 +175,7 @@ ot_static_delta_builtin_delete (int argc, char **argv, GCancellable *cancellable
|
||||||
g_autoptr(OstreeRepo) repo = NULL;
|
g_autoptr(OstreeRepo) repo = NULL;
|
||||||
const char *delta_id = NULL;
|
const char *delta_id = NULL;
|
||||||
|
|
||||||
context = g_option_context_new ("DELETE - Remove a delta");
|
context = g_option_context_new ("- Remove a delta");
|
||||||
|
|
||||||
if (!ostree_option_context_parse (context, list_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
if (!ostree_option_context_parse (context, list_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -212,7 +205,7 @@ ot_static_delta_builtin_generate (int argc, char **argv, GCancellable *cancellab
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
g_autoptr(GOptionContext) context = NULL;
|
||||||
g_autoptr(OstreeRepo) repo = NULL;
|
g_autoptr(OstreeRepo) repo = NULL;
|
||||||
|
|
||||||
context = g_option_context_new ("GENERATE [TO] - Generate static delta files");
|
context = g_option_context_new ("[TO] - Generate static delta files");
|
||||||
if (!ostree_option_context_parse (context, generate_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
if (!ostree_option_context_parse (context, generate_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
@ -363,7 +356,7 @@ ot_static_delta_builtin_apply_offline (int argc, char **argv, GCancellable *canc
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
g_autoptr(GOptionContext) context = NULL;
|
||||||
g_autoptr(OstreeRepo) repo = NULL;
|
g_autoptr(OstreeRepo) repo = NULL;
|
||||||
|
|
||||||
context = g_option_context_new ("APPLY-OFFLINE - Apply static delta file");
|
context = g_option_context_new ("- Apply static delta file");
|
||||||
if (!ostree_option_context_parse (context, apply_offline_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
if (!ostree_option_context_parse (context, apply_offline_options, &argc, &argv, OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
@ -397,13 +390,9 @@ ot_static_delta_builtin_apply_offline (int argc, char **argv, GCancellable *canc
|
||||||
gboolean
|
gboolean
|
||||||
ostree_builtin_static_delta (int argc, char **argv, GCancellable *cancellable, GError **error)
|
ostree_builtin_static_delta (int argc, char **argv, GCancellable *cancellable, GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
OstreeCommand *command = NULL;
|
|
||||||
const char *cmdname = NULL;
|
|
||||||
int i;
|
|
||||||
gboolean want_help = FALSE;
|
gboolean want_help = FALSE;
|
||||||
|
const char *cmdname = NULL;
|
||||||
for (i = 1; i < argc; i++)
|
for (int i = 1; i < argc; i++)
|
||||||
{
|
{
|
||||||
if (argv[i][0] != '-')
|
if (argv[i][0] != '-')
|
||||||
{
|
{
|
||||||
|
|
@ -420,11 +409,10 @@ ostree_builtin_static_delta (int argc, char **argv, GCancellable *cancellable, G
|
||||||
if (!cmdname && !want_help)
|
if (!cmdname && !want_help)
|
||||||
{
|
{
|
||||||
static_delta_usage (argv, TRUE);
|
static_delta_usage (argv, TRUE);
|
||||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
return glnx_throw (error, "No command specified");
|
||||||
"No command specified");
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OstreeCommand *command = NULL;
|
||||||
if (cmdname)
|
if (cmdname)
|
||||||
{
|
{
|
||||||
command = static_delta_subcommands;
|
command = static_delta_subcommands;
|
||||||
|
|
@ -439,22 +427,17 @@ ostree_builtin_static_delta (int argc, char **argv, GCancellable *cancellable, G
|
||||||
if (want_help && command == NULL)
|
if (want_help && command == NULL)
|
||||||
{
|
{
|
||||||
static_delta_usage (argv, FALSE);
|
static_delta_usage (argv, FALSE);
|
||||||
ret = TRUE;
|
return TRUE; /* Note early return */
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!command->fn)
|
if (!command->fn)
|
||||||
{
|
{
|
||||||
g_autofree char *msg = g_strdup_printf ("Unknown command '%s'", cmdname);
|
|
||||||
static_delta_usage (argv, TRUE);
|
static_delta_usage (argv, TRUE);
|
||||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, msg);
|
return glnx_throw (error, "Unknown \"static-delta\" subcommand '%s'", cmdname);
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!command->fn (argc, argv, cancellable, error))
|
g_autofree char *prgname = g_strdup_printf ("%s %s", g_get_prgname (), cmdname);
|
||||||
goto out;
|
g_set_prgname (prgname);
|
||||||
|
|
||||||
ret = TRUE;
|
return command->fn (argc, argv, cancellable, error);
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,15 +78,11 @@ int
|
||||||
ostree_usage (OstreeCommand *commands,
|
ostree_usage (OstreeCommand *commands,
|
||||||
gboolean is_error)
|
gboolean is_error)
|
||||||
{
|
{
|
||||||
g_autoptr(GOptionContext) context = NULL;
|
g_autoptr(GOptionContext) context =
|
||||||
g_autofree char *help;
|
ostree_option_context_new_with_commands (commands);
|
||||||
|
|
||||||
context = ostree_option_context_new_with_commands (commands);
|
|
||||||
|
|
||||||
g_option_context_add_main_entries (context, global_entries, NULL);
|
g_option_context_add_main_entries (context, global_entries, NULL);
|
||||||
|
|
||||||
help = g_option_context_get_help (context, FALSE, NULL);
|
g_autofree char *help = g_option_context_get_help (context, FALSE, NULL);
|
||||||
|
|
||||||
if (is_error)
|
if (is_error)
|
||||||
g_printerr ("%s", help);
|
g_printerr ("%s", help);
|
||||||
else
|
else
|
||||||
|
|
@ -185,13 +181,10 @@ ostree_run (int argc,
|
||||||
{
|
{
|
||||||
g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
"Unknown command '%s'", command_name);
|
"Unknown command '%s'", command_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ostree_usage (commands, TRUE);
|
ostree_usage (commands, TRUE);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
help = g_option_context_get_help (context, FALSE, NULL);
|
|
||||||
g_printerr ("%s", help);
|
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -381,9 +374,17 @@ ostree_admin_option_context_parse (GOptionContext *context,
|
||||||
|
|
||||||
g_option_context_add_main_entries (context, global_admin_entries, NULL);
|
g_option_context_add_main_entries (context, global_admin_entries, NULL);
|
||||||
|
|
||||||
if (!ostree_option_context_parse (context, main_entries, argc, argv, OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error))
|
if (!ostree_option_context_parse (context, main_entries, argc, argv,
|
||||||
|
OSTREE_BUILTIN_FLAG_NO_REPO, NULL, cancellable, error))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (!opt_print_current_dir && (flags & OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT))
|
||||||
|
{
|
||||||
|
g_assert_null (out_sysroot);
|
||||||
|
/* Early return if no sysroot is requested */
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
g_autoptr(GFile) sysroot_path = NULL;
|
g_autoptr(GFile) sysroot_path = NULL;
|
||||||
if (opt_sysroot != NULL)
|
if (opt_sysroot != NULL)
|
||||||
sysroot_path = g_file_new_for_path (opt_sysroot);
|
sysroot_path = g_file_new_for_path (opt_sysroot);
|
||||||
|
|
@ -391,12 +392,24 @@ ostree_admin_option_context_parse (GOptionContext *context,
|
||||||
g_autoptr(OstreeSysroot) sysroot = ostree_sysroot_new (sysroot_path);
|
g_autoptr(OstreeSysroot) sysroot = ostree_sysroot_new (sysroot_path);
|
||||||
g_signal_connect (sysroot, "journal-msg", G_CALLBACK (on_sysroot_journal_msg), NULL);
|
g_signal_connect (sysroot, "journal-msg", G_CALLBACK (on_sysroot_journal_msg), NULL);
|
||||||
|
|
||||||
|
if ((flags & OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED) == 0)
|
||||||
|
{
|
||||||
|
/* Released when sysroot is finalized, or on process exit */
|
||||||
|
if (!ot_admin_sysroot_lock (sysroot, error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (flags & OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER)
|
if (flags & OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER)
|
||||||
{
|
{
|
||||||
GFile *path = ostree_sysroot_get_path (sysroot);
|
OstreeDeployment *booted = ostree_sysroot_get_booted_deployment (sysroot);
|
||||||
|
|
||||||
/* If sysroot path is "/" then user must be root. */
|
/* Only require root if we're manipulating a booted sysroot. (Mostly
|
||||||
if (!g_file_has_parent (path, NULL) && getuid () != 0)
|
* useful for the test suite)
|
||||||
|
*/
|
||||||
|
if (booted && getuid () != 0)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
|
||||||
"You must be root to perform this command");
|
"You must be root to perform this command");
|
||||||
|
|
@ -411,9 +424,6 @@ ostree_admin_option_context_parse (GOptionContext *context,
|
||||||
g_autoptr(GFile) deployment_file = NULL;
|
g_autoptr(GFile) deployment_file = NULL;
|
||||||
g_autofree char *deployment_path = NULL;
|
g_autofree char *deployment_path = NULL;
|
||||||
|
|
||||||
if (!ostree_sysroot_load (sysroot, cancellable, error))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
deployments = ostree_sysroot_get_deployments (sysroot);
|
deployments = ostree_sysroot_get_deployments (sysroot);
|
||||||
if (deployments->len == 0)
|
if (deployments->len == 0)
|
||||||
return glnx_throw (error, "Unable to find a deployment in sysroot");
|
return glnx_throw (error, "Unable to find a deployment in sysroot");
|
||||||
|
|
@ -433,13 +443,6 @@ ostree_admin_option_context_parse (GOptionContext *context,
|
||||||
exit (EXIT_SUCCESS);
|
exit (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED) == 0)
|
|
||||||
{
|
|
||||||
/* Released when sysroot is finalized, or on process exit */
|
|
||||||
if (!ot_admin_sysroot_lock (sysroot, error))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (out_sysroot)
|
if (out_sysroot)
|
||||||
*out_sysroot = g_steal_pointer (&sysroot);
|
*out_sysroot = g_steal_pointer (&sysroot);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,9 @@ typedef enum {
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_NONE = 0,
|
OSTREE_ADMIN_BUILTIN_FLAG_NONE = 0,
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER = 1 << 0,
|
OSTREE_ADMIN_BUILTIN_FLAG_SUPERUSER = (1 << 0),
|
||||||
OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED = 1 << 1
|
OSTREE_ADMIN_BUILTIN_FLAG_UNLOCKED = (1 << 1),
|
||||||
|
OSTREE_ADMIN_BUILTIN_FLAG_NO_SYSROOT = (1 << 2),
|
||||||
} OstreeAdminBuiltinFlags;
|
} OstreeAdminBuiltinFlags;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
||||||
|
|
@ -198,26 +198,42 @@ callback_link (const char *from, const char *to)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
/* Check whether @stbuf refers to a hardlinked regfile or symlink, and if so
|
||||||
stbuf_is_regfile_hardlinked (struct stat *stbuf)
|
* return -EROFS. Otherwise return 0.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
can_write_stbuf (struct stat *stbuf)
|
||||||
{
|
{
|
||||||
return S_ISREG (stbuf->st_mode) && stbuf->st_nlink > 1;
|
/* If it's not a regular file or symlink, ostree won't hardlink it, so allow
|
||||||
|
* writes - it might be a FIFO or device that somehow
|
||||||
|
* ended up underneath our mount.
|
||||||
|
*/
|
||||||
|
if (!(S_ISREG (stbuf->st_mode) || S_ISLNK (stbuf->st_mode)))
|
||||||
|
return 0;
|
||||||
|
/* If the object isn't hardlinked, it's OK to write */
|
||||||
|
if (stbuf->st_nlink <= 1)
|
||||||
|
return 0;
|
||||||
|
/* Otherwise, it's a hardlinked file or symlink; it must be
|
||||||
|
* immutable.
|
||||||
|
*/
|
||||||
|
return -EROFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check whether @path refers to a hardlinked regfile or symlink, and if so
|
||||||
|
* return -EROFS. Otherwise return 0.
|
||||||
|
*/
|
||||||
static int
|
static int
|
||||||
can_write (const char *path)
|
can_write (const char *path)
|
||||||
{
|
{
|
||||||
struct stat stbuf;
|
struct stat stbuf;
|
||||||
if (fstatat (basefd, path, &stbuf, 0) == -1)
|
if (fstatat (basefd, path, &stbuf, AT_SYMLINK_NOFOLLOW) == -1)
|
||||||
{
|
{
|
||||||
if (errno == ENOENT)
|
if (errno == ENOENT)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
if (stbuf_is_regfile_hardlinked (&stbuf))
|
return can_write_stbuf (&stbuf);
|
||||||
return -EROFS;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VERIFY_WRITE(path) do { \
|
#define VERIFY_WRITE(path) do { \
|
||||||
|
|
@ -231,6 +247,10 @@ callback_chmod (const char *path, mode_t mode)
|
||||||
{
|
{
|
||||||
path = ENSURE_RELPATH (path);
|
path = ENSURE_RELPATH (path);
|
||||||
VERIFY_WRITE(path);
|
VERIFY_WRITE(path);
|
||||||
|
/* Note we can't use AT_SYMLINK_NOFOLLOW yet;
|
||||||
|
* https://marc.info/?l=linux-kernel&m=148830147803162&w=2
|
||||||
|
* https://marc.info/?l=linux-fsdevel&m=149193779929561&w=2
|
||||||
|
*/
|
||||||
if (fchmodat (basefd, path, mode, 0) != 0)
|
if (fchmodat (basefd, path, mode, 0) != 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -241,7 +261,7 @@ callback_chown (const char *path, uid_t uid, gid_t gid)
|
||||||
{
|
{
|
||||||
path = ENSURE_RELPATH (path);
|
path = ENSURE_RELPATH (path);
|
||||||
VERIFY_WRITE(path);
|
VERIFY_WRITE(path);
|
||||||
if (fchownat (basefd, path, uid, gid, 0) != 0)
|
if (fchownat (basefd, path, uid, gid, AT_SYMLINK_NOFOLLOW) != 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -254,7 +274,7 @@ callback_truncate (const char *path, off_t size)
|
||||||
path = ENSURE_RELPATH (path);
|
path = ENSURE_RELPATH (path);
|
||||||
VERIFY_WRITE(path);
|
VERIFY_WRITE(path);
|
||||||
|
|
||||||
fd = openat (basefd, path, O_WRONLY);
|
fd = openat (basefd, path, O_NOFOLLOW|O_WRONLY);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
|
|
@ -312,10 +332,11 @@ do_open (const char *path, mode_t mode, struct fuse_file_info *finfo)
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stbuf_is_regfile_hardlinked (&stbuf))
|
int r = can_write_stbuf (&stbuf);
|
||||||
|
if (r != 0)
|
||||||
{
|
{
|
||||||
(void) close (fd);
|
(void) close (fd);
|
||||||
return -EROFS;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle O_TRUNC here only after verifying hardlink state */
|
/* Handle O_TRUNC here only after verifying hardlink state */
|
||||||
|
|
@ -433,7 +454,7 @@ callback_access (const char *path, int mode)
|
||||||
* before trying to do an unlink. So...we'll just lie about
|
* before trying to do an unlink. So...we'll just lie about
|
||||||
* writable access here.
|
* writable access here.
|
||||||
*/
|
*/
|
||||||
if (faccessat (basefd, path, mode, 0) == -1)
|
if (faccessat (basefd, path, mode, AT_SYMLINK_NOFOLLOW) == -1)
|
||||||
return -errno;
|
return -errno;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo "1..$((22 + ${extra_admin_tests:-0}))"
|
||||||
|
|
||||||
function validate_bootloader() {
|
function validate_bootloader() {
|
||||||
cd ${test_tmpdir};
|
cd ${test_tmpdir};
|
||||||
bootloader=""
|
bootloader=""
|
||||||
|
|
@ -33,6 +35,13 @@ function validate_bootloader() {
|
||||||
cd -
|
cd -
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Test generate_deployment_refs()
|
||||||
|
assert_ostree_deployment_refs() {
|
||||||
|
${CMD_PREFIX} ostree --repo=sysroot/ostree/repo refs ostree | sort > ostree-refs.txt
|
||||||
|
(for v in "$@"; do echo $v; done) | sort > ostree-refs-expected.txt
|
||||||
|
diff -u ostree-refs{-expected,}.txt
|
||||||
|
}
|
||||||
|
|
||||||
orig_mtime=$(stat -c '%.Y' sysroot/ostree/deploy)
|
orig_mtime=$(stat -c '%.Y' sysroot/ostree/deploy)
|
||||||
${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull-local --remote=testos testos-repo testos/buildmaster/x86_64-runtime
|
${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull-local --remote=testos testos-repo testos/buildmaster/x86_64-runtime
|
||||||
rev=$(${CMD_PREFIX} ostree --repo=sysroot/ostree/repo rev-parse testos/buildmaster/x86_64-runtime)
|
rev=$(${CMD_PREFIX} ostree --repo=sysroot/ostree/repo rev-parse testos/buildmaster/x86_64-runtime)
|
||||||
|
|
@ -53,6 +62,7 @@ assert_file_has_content curdir ^`pwd`/sysroot/ostree/deploy/testos/deploy/${rev}
|
||||||
|
|
||||||
echo "ok --print-current-dir"
|
echo "ok --print-current-dir"
|
||||||
|
|
||||||
|
# Test layout of bootloader config and refs
|
||||||
assert_not_has_dir sysroot/boot/loader.0
|
assert_not_has_dir sysroot/boot/loader.0
|
||||||
assert_has_dir sysroot/boot/loader.1
|
assert_has_dir sysroot/boot/loader.1
|
||||||
assert_has_dir sysroot/ostree/boot.1.1
|
assert_has_dir sysroot/ostree/boot.1.1
|
||||||
|
|
@ -62,9 +72,8 @@ assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'option
|
||||||
assert_file_has_content sysroot/boot/ostree/testos-${bootcsum}/vmlinuz-3.6.0 'a kernel'
|
assert_file_has_content sysroot/boot/ostree/testos-${bootcsum}/vmlinuz-3.6.0 'a kernel'
|
||||||
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.0/etc/os-release 'NAME=TestOS'
|
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.0/etc/os-release 'NAME=TestOS'
|
||||||
assert_file_has_content sysroot/ostree/boot.1/testos/${bootcsum}/0/etc/os-release 'NAME=TestOS'
|
assert_file_has_content sysroot/ostree/boot.1/testos/${bootcsum}/0/etc/os-release 'NAME=TestOS'
|
||||||
|
assert_ostree_deployment_refs 1/1/0
|
||||||
${CMD_PREFIX} ostree admin status
|
${CMD_PREFIX} ostree admin status
|
||||||
|
|
||||||
|
|
||||||
echo "ok layout"
|
echo "ok layout"
|
||||||
|
|
||||||
orig_mtime=$(stat -c '%.Y' sysroot/ostree/deploy)
|
orig_mtime=$(stat -c '%.Y' sysroot/ostree/deploy)
|
||||||
|
|
@ -82,6 +91,7 @@ assert_not_has_dir sysroot/ostree/boot.1.1
|
||||||
assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'options.* root=LABEL=MOO'
|
assert_file_has_content sysroot/boot/loader/entries/ostree-testos-0.conf 'options.* root=LABEL=MOO'
|
||||||
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.1/etc/os-release 'NAME=TestOS'
|
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.1/etc/os-release 'NAME=TestOS'
|
||||||
assert_file_has_content sysroot/ostree/boot.0/testos/${bootcsum}/0/etc/os-release 'NAME=TestOS'
|
assert_file_has_content sysroot/ostree/boot.0/testos/${bootcsum}/0/etc/os-release 'NAME=TestOS'
|
||||||
|
assert_ostree_deployment_refs 0/1/{0,1}
|
||||||
${CMD_PREFIX} ostree admin status
|
${CMD_PREFIX} ostree admin status
|
||||||
validate_bootloader
|
validate_bootloader
|
||||||
|
|
||||||
|
|
@ -94,6 +104,7 @@ assert_not_has_dir sysroot/boot/loader.1
|
||||||
# But swap subbootversion
|
# But swap subbootversion
|
||||||
assert_has_dir sysroot/ostree/boot.0.0
|
assert_has_dir sysroot/ostree/boot.0.0
|
||||||
assert_not_has_dir sysroot/ostree/boot.0.1
|
assert_not_has_dir sysroot/ostree/boot.0.1
|
||||||
|
assert_ostree_deployment_refs 0/0/{0,1}
|
||||||
${CMD_PREFIX} ostree admin status
|
${CMD_PREFIX} ostree admin status
|
||||||
validate_bootloader
|
validate_bootloader
|
||||||
|
|
||||||
|
|
@ -108,6 +119,7 @@ assert_has_file sysroot/boot/loader/entries/ostree-testos-1.conf
|
||||||
assert_has_file sysroot/boot/loader/entries/ostree-otheros-0.conf
|
assert_has_file sysroot/boot/loader/entries/ostree-otheros-0.conf
|
||||||
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.1/etc/os-release 'NAME=TestOS'
|
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.1/etc/os-release 'NAME=TestOS'
|
||||||
assert_file_has_content sysroot/ostree/deploy/otheros/deploy/${rev}.0/etc/os-release 'NAME=TestOS'
|
assert_file_has_content sysroot/ostree/deploy/otheros/deploy/${rev}.0/etc/os-release 'NAME=TestOS'
|
||||||
|
assert_ostree_deployment_refs 1/1/{0,1,2}
|
||||||
${CMD_PREFIX} ostree admin status
|
${CMD_PREFIX} ostree admin status
|
||||||
validate_bootloader
|
validate_bootloader
|
||||||
|
|
||||||
|
|
@ -121,6 +133,7 @@ assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.2/etc/os-rele
|
||||||
assert_has_file sysroot/boot/loader/entries/ostree-testos-2.conf
|
assert_has_file sysroot/boot/loader/entries/ostree-testos-2.conf
|
||||||
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/os-release 'NAME=TestOS'
|
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/os-release 'NAME=TestOS'
|
||||||
${CMD_PREFIX} ostree admin status
|
${CMD_PREFIX} ostree admin status
|
||||||
|
assert_ostree_deployment_refs 0/1/{0,1,2,3}
|
||||||
validate_bootloader
|
validate_bootloader
|
||||||
|
|
||||||
echo "ok fourth deploy (retain)"
|
echo "ok fourth deploy (retain)"
|
||||||
|
|
@ -130,6 +143,8 @@ rm -r sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/testdirectory
|
||||||
rm sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/aconfigfile
|
rm sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/aconfigfile
|
||||||
ln -s /ENOENT sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/a-new-broken-symlink
|
ln -s /ENOENT sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/a-new-broken-symlink
|
||||||
${CMD_PREFIX} ostree admin deploy --retain --os=testos testos:testos/buildmaster/x86_64-runtime
|
${CMD_PREFIX} ostree admin deploy --retain --os=testos testos:testos/buildmaster/x86_64-runtime
|
||||||
|
assert_not_has_dir sysroot/boot/loader.0
|
||||||
|
assert_has_dir sysroot/boot/loader.1
|
||||||
linktarget=$(readlink sysroot/ostree/deploy/testos/deploy/${rev}.4/etc/a-new-broken-symlink)
|
linktarget=$(readlink sysroot/ostree/deploy/testos/deploy/${rev}.4/etc/a-new-broken-symlink)
|
||||||
test "${linktarget}" = /ENOENT
|
test "${linktarget}" = /ENOENT
|
||||||
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/os-release 'NAME=TestOS'
|
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/os-release 'NAME=TestOS'
|
||||||
|
|
@ -138,9 +153,36 @@ assert_file_has_content sysroot/ostree/deploy/testos/deploy/${rev}.4/etc/a-new-c
|
||||||
assert_not_has_file sysroot/ostree/deploy/testos/deploy/${rev}.4/etc/aconfigfile
|
assert_not_has_file sysroot/ostree/deploy/testos/deploy/${rev}.4/etc/aconfigfile
|
||||||
${CMD_PREFIX} ostree admin status
|
${CMD_PREFIX} ostree admin status
|
||||||
validate_bootloader
|
validate_bootloader
|
||||||
|
|
||||||
echo "ok deploy with modified /etc"
|
echo "ok deploy with modified /etc"
|
||||||
|
|
||||||
|
# we now have 5 deployments, let's bring that back down to 1
|
||||||
|
for i in $(seq 4); do
|
||||||
|
${CMD_PREFIX} ostree admin undeploy 0
|
||||||
|
done
|
||||||
|
assert_has_file sysroot/boot/loader/entries/ostree-testos-0.conf
|
||||||
|
assert_not_has_file sysroot/boot/loader/entries/ostree-testos-1.conf
|
||||||
|
assert_not_has_file sysroot/boot/loader/entries/ostree-otheros-1.conf
|
||||||
|
${CMD_PREFIX} ostree admin deploy --not-as-default --os=otheros testos:testos/buildmaster/x86_64-runtime
|
||||||
|
assert_has_dir sysroot/boot/loader.0
|
||||||
|
assert_not_has_dir sysroot/boot/loader.1
|
||||||
|
assert_has_file sysroot/boot/loader/entries/ostree-testos-0.conf
|
||||||
|
assert_has_file sysroot/boot/loader/entries/ostree-otheros-1.conf
|
||||||
|
${CMD_PREFIX} ostree admin status
|
||||||
|
validate_bootloader
|
||||||
|
|
||||||
|
echo "ok deploy --not-as-default"
|
||||||
|
|
||||||
|
${CMD_PREFIX} ostree admin deploy --retain-rollback --os=otheros testos:testos/buildmaster/x86_64-runtime
|
||||||
|
assert_not_has_dir sysroot/boot/loader.0
|
||||||
|
assert_has_dir sysroot/boot/loader.1
|
||||||
|
assert_has_file sysroot/boot/loader/entries/ostree-otheros-0.conf
|
||||||
|
assert_has_file sysroot/boot/loader/entries/ostree-testos-1.conf
|
||||||
|
assert_has_file sysroot/boot/loader/entries/ostree-otheros-2.conf
|
||||||
|
${CMD_PREFIX} ostree admin status
|
||||||
|
validate_bootloader
|
||||||
|
|
||||||
|
echo "ok deploy --retain-rollback"
|
||||||
|
|
||||||
os_repository_new_commit
|
os_repository_new_commit
|
||||||
${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull-local --remote=testos testos-repo testos/buildmaster/x86_64-runtime
|
${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull-local --remote=testos testos-repo testos/buildmaster/x86_64-runtime
|
||||||
newrev=$(${CMD_PREFIX} ostree --repo=sysroot/ostree/repo rev-parse testos:testos/buildmaster/x86_64-runtime)
|
newrev=$(${CMD_PREFIX} ostree --repo=sysroot/ostree/repo rev-parse testos:testos/buildmaster/x86_64-runtime)
|
||||||
|
|
@ -153,7 +195,7 @@ assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/os-r
|
||||||
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/a-new-default-config-file "a new default config file"
|
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/a-new-default-config-file "a new default config file"
|
||||||
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/new-default-dir/moo "a new default dir and file"
|
assert_file_has_content sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/new-default-dir/moo "a new default dir and file"
|
||||||
# And persist /etc changes from before
|
# And persist /etc changes from before
|
||||||
assert_not_has_file sysroot/ostree/deploy/testos/deploy/${rev}.3/etc/aconfigfile
|
assert_not_has_file sysroot/ostree/deploy/testos/deploy/${rev}.4/etc/aconfigfile
|
||||||
${CMD_PREFIX} ostree admin status
|
${CMD_PREFIX} ostree admin status
|
||||||
validate_bootloader
|
validate_bootloader
|
||||||
|
|
||||||
|
|
@ -250,6 +292,15 @@ assert_not_file_has_content sysroot/ostree/repo/config remote-test-nonphysical
|
||||||
assert_file_has_content ${deployment}/etc/ostree/remotes.d/remote-test-nonphysical.conf testos-repo
|
assert_file_has_content ${deployment}/etc/ostree/remotes.d/remote-test-nonphysical.conf testos-repo
|
||||||
echo "ok remote add nonphysical sysroot"
|
echo "ok remote add nonphysical sysroot"
|
||||||
|
|
||||||
|
# Test that setting add-remotes-config-dir to false adds a remote in the
|
||||||
|
# config file rather than the remotes config dir even though this is a
|
||||||
|
# "system" repo.
|
||||||
|
${CMD_PREFIX} ostree --repo=sysroot/ostree/repo config set core.add-remotes-config-dir false
|
||||||
|
${CMD_PREFIX} ostree --sysroot=${deployment} remote add --set=gpg-verify=false remote-test-config-dir file://$(pwd)/testos-repo
|
||||||
|
assert_not_has_file ${deployment}/etc/ostree/remotes.d/remote-test-config-dir.conf testos-repo
|
||||||
|
assert_file_has_content sysroot/ostree/repo/config remote-test-config-dir
|
||||||
|
echo "ok remote add nonphysical sysroot add-remotes-config-dir false"
|
||||||
|
|
||||||
if env OSTREE_SYSROOT_DEBUG="${OSTREE_SYSROOT_DEBUG},test-fifreeze" \
|
if env OSTREE_SYSROOT_DEBUG="${OSTREE_SYSROOT_DEBUG},test-fifreeze" \
|
||||||
${CMD_PREFIX} ostree admin deploy --os=testos testos:testos/buildmaster/x86_64-runtime 2>err.txt; then
|
${CMD_PREFIX} ostree admin deploy --os=testos testos:testos/buildmaster/x86_64-runtime 2>err.txt; then
|
||||||
fatal "fifreeze-test exited successfully?"
|
fatal "fifreeze-test exited successfully?"
|
||||||
|
|
|
||||||
|
|
@ -19,13 +19,14 @@
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
echo "1..$((70 + ${extra_basic_tests:-0}))"
|
echo "1..$((72 + ${extra_basic_tests:-0}))"
|
||||||
|
|
||||||
$CMD_PREFIX ostree --version > version.yaml
|
$CMD_PREFIX ostree --version > version.yaml
|
||||||
python -c 'import yaml; yaml.safe_load(open("version.yaml"))'
|
python -c 'import yaml; yaml.safe_load(open("version.yaml"))'
|
||||||
echo "ok yaml version"
|
echo "ok yaml version"
|
||||||
|
|
||||||
CHECKOUT_U_ARG=""
|
CHECKOUT_U_ARG=""
|
||||||
|
CHECKOUT_H_ARGS="-H"
|
||||||
COMMIT_ARGS=""
|
COMMIT_ARGS=""
|
||||||
DIFF_ARGS=""
|
DIFF_ARGS=""
|
||||||
if is_bare_user_only_repo repo; then
|
if is_bare_user_only_repo repo; then
|
||||||
|
|
@ -36,6 +37,11 @@ if is_bare_user_only_repo repo; then
|
||||||
DIFF_ARGS="--owner-uid=0 --owner-gid=0 --no-xattrs"
|
DIFF_ARGS="--owner-uid=0 --owner-gid=0 --no-xattrs"
|
||||||
# Also, since we can't check out uid=0 files we need to check out in user mode
|
# Also, since we can't check out uid=0 files we need to check out in user mode
|
||||||
CHECKOUT_U_ARG="-U"
|
CHECKOUT_U_ARG="-U"
|
||||||
|
CHECKOUT_H_ARGS="-U -H"
|
||||||
|
else
|
||||||
|
if grep -E -q '^mode=bare-user' repo/config; then
|
||||||
|
CHECKOUT_H_ARGS="-U -H"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
validate_checkout_basic() {
|
validate_checkout_basic() {
|
||||||
|
|
@ -106,12 +112,15 @@ echo "ok shortened checksum"
|
||||||
(cd repo && ${CMD_PREFIX} ostree rev-parse test2)
|
(cd repo && ${CMD_PREFIX} ostree rev-parse test2)
|
||||||
echo "ok repo-in-cwd"
|
echo "ok repo-in-cwd"
|
||||||
|
|
||||||
|
if ! skip_one_without_user_xattrs; then
|
||||||
rm test-repo -rf
|
rm test-repo -rf
|
||||||
ostree_repo_init test-repo --mode=bare-user
|
ostree_repo_init test-repo --mode=bare-user
|
||||||
ostree_repo_init test-repo --mode=bare-user
|
ostree_repo_init test-repo --mode=bare-user
|
||||||
rm test-repo -rf
|
rm test-repo -rf
|
||||||
echo "ok repo-init on existing repo"
|
echo "ok repo-init on existing repo"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! skip_one_without_user_xattrs; then
|
||||||
rm test-repo -rf
|
rm test-repo -rf
|
||||||
ostree_repo_init test-repo --mode=bare-user
|
ostree_repo_init test-repo --mode=bare-user
|
||||||
${CMD_PREFIX} ostree --repo=test-repo refs
|
${CMD_PREFIX} ostree --repo=test-repo refs
|
||||||
|
|
@ -119,6 +128,7 @@ rm -rf test-repo/tmp
|
||||||
${CMD_PREFIX} ostree --repo=test-repo refs
|
${CMD_PREFIX} ostree --repo=test-repo refs
|
||||||
assert_has_dir test-repo/tmp
|
assert_has_dir test-repo/tmp
|
||||||
echo "ok autocreate tmp"
|
echo "ok autocreate tmp"
|
||||||
|
fi
|
||||||
|
|
||||||
rm checkout-test2 -rf
|
rm checkout-test2 -rf
|
||||||
$OSTREE checkout test2 checkout-test2
|
$OSTREE checkout test2 checkout-test2
|
||||||
|
|
@ -262,6 +272,7 @@ cd ${test_tmpdir}
|
||||||
assert_file_has_content diff-test2-2 'M */four$'
|
assert_file_has_content diff-test2-2 'M */four$'
|
||||||
echo "ok diff file changing type"
|
echo "ok diff file changing type"
|
||||||
|
|
||||||
|
if ! skip_one_without_user_xattrs; then
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
mkdir repo2
|
mkdir repo2
|
||||||
# Use a different mode to test hardlinking metadata only
|
# Use a different mode to test hardlinking metadata only
|
||||||
|
|
@ -276,13 +287,16 @@ test2_commitid=$(${CMD_PREFIX} ostree --repo=repo rev-parse test2)
|
||||||
test2_commit_relpath=/objects/${test2_commitid:0:2}/${test2_commitid:2}.commit
|
test2_commit_relpath=/objects/${test2_commitid:0:2}/${test2_commitid:2}.commit
|
||||||
assert_files_hardlinked repo/${test2_commit_relpath} repo2/${test2_commit_relpath}
|
assert_files_hardlinked repo/${test2_commit_relpath} repo2/${test2_commit_relpath}
|
||||||
echo "ok pull-local (hardlinking metadata)"
|
echo "ok pull-local (hardlinking metadata)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! skip_one_without_user_xattrs; then
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
rm repo2 -rf && mkdir repo2
|
rm repo2 -rf && mkdir repo2
|
||||||
ostree_repo_init repo2 --mode=$opposite_mode
|
ostree_repo_init repo2 --mode=$opposite_mode
|
||||||
${CMD_PREFIX} ostree --repo=repo2 pull-local --bareuseronly-files repo test2
|
${CMD_PREFIX} ostree --repo=repo2 pull-local --bareuseronly-files repo test2
|
||||||
${CMD_PREFIX} ostree --repo=repo2 fsck -q
|
${CMD_PREFIX} ostree --repo=repo2 fsck -q
|
||||||
echo "ok pull-local --bareuseronly-files"
|
echo "ok pull-local --bareuseronly-files"
|
||||||
|
fi
|
||||||
|
|
||||||
# This is mostly a copy of the suid test in test-basic-user-only.sh,
|
# This is mostly a copy of the suid test in test-basic-user-only.sh,
|
||||||
# but for the `pull --bareuseronly-files` case.
|
# but for the `pull --bareuseronly-files` case.
|
||||||
|
|
@ -303,11 +317,13 @@ fi
|
||||||
assert_file_has_content err.txt 'object.*\.file: invalid mode.*with bits 040.*'
|
assert_file_has_content err.txt 'object.*\.file: invalid mode.*with bits 040.*'
|
||||||
echo "ok pull-local (bareuseronly files)"
|
echo "ok pull-local (bareuseronly files)"
|
||||||
|
|
||||||
|
if ! skip_one_without_user_xattrs; then
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
${CMD_PREFIX} ostree --repo=repo2 checkout ${CHECKOUT_U_ARG} test2 test2-checkout-from-local-clone
|
${CMD_PREFIX} ostree --repo=repo2 checkout ${CHECKOUT_U_ARG} test2 test2-checkout-from-local-clone
|
||||||
cd test2-checkout-from-local-clone
|
cd test2-checkout-from-local-clone
|
||||||
assert_file_has_content yet/another/tree/green 'leaf'
|
assert_file_has_content yet/another/tree/green 'leaf'
|
||||||
echo "ok local clone checkout"
|
echo "ok local clone checkout"
|
||||||
|
fi
|
||||||
|
|
||||||
$OSTREE checkout -U test2 checkout-user-test2
|
$OSTREE checkout -U test2 checkout-user-test2
|
||||||
echo "ok user checkout"
|
echo "ok user checkout"
|
||||||
|
|
@ -459,6 +475,57 @@ assert_file_has_content checkout-test-union-add/union-add-test 'existing file fo
|
||||||
assert_file_has_content checkout-test-union-add/union-add-test2 'another file for union add testing'
|
assert_file_has_content checkout-test-union-add/union-add-test2 'another file for union add testing'
|
||||||
echo "ok checkout union add"
|
echo "ok checkout union add"
|
||||||
|
|
||||||
|
# Test --union-identical <https://github.com/projectatomic/rpm-ostree/issues/982>
|
||||||
|
# Prepare data:
|
||||||
|
cd ${test_tmpdir}
|
||||||
|
for x in $(seq 3); do
|
||||||
|
mkdir -p pkg${x}/usr/{bin,share/licenses}
|
||||||
|
# Separate binaries and symlinks
|
||||||
|
echo 'binary for pkg'${x} > pkg${x}/usr/bin/pkg${x}
|
||||||
|
ln -s pkg${x} pkg${x}/usr/bin/link${x}
|
||||||
|
# But they share the GPL
|
||||||
|
echo 'this is the GPL' > pkg${x}/usr/share/licenses/COPYING
|
||||||
|
ln -s COPYING pkg${x}/usr/share/licenses/LICENSE
|
||||||
|
$OSTREE commit -b union-identical-pkg${x} --tree=dir=pkg${x}
|
||||||
|
done
|
||||||
|
rm union-identical-test -rf
|
||||||
|
for x in $(seq 3); do
|
||||||
|
$OSTREE checkout ${CHECKOUT_H_ARGS} --union-identical union-identical-pkg${x} union-identical-test
|
||||||
|
done
|
||||||
|
if $OSTREE checkout ${CHECKOUT_H_ARGS/-H/} --union-identical union-identical-pkg${x} union-identical-test-tmp 2>err.txt; then
|
||||||
|
fatal "--union-identical without -H"
|
||||||
|
fi
|
||||||
|
assert_file_has_content err.txt "error:.*--union-identical requires --require-hardlinks"
|
||||||
|
for x in $(seq 3); do
|
||||||
|
for v in pkg link; do
|
||||||
|
assert_file_has_content union-identical-test/usr/bin/${v}${x} "binary for pkg"${x}
|
||||||
|
done
|
||||||
|
for v in COPYING LICENSE; do
|
||||||
|
assert_file_has_content union-identical-test/usr/share/licenses/${v} GPL
|
||||||
|
done
|
||||||
|
done
|
||||||
|
echo "ok checkout union identical merges"
|
||||||
|
|
||||||
|
# Make conflicting packages, one with regfile, one with symlink
|
||||||
|
mkdir -p pkg-conflict1bin/usr/{bin,share/licenses}
|
||||||
|
echo 'binary for pkg-conflict1bin' > pkg-conflict1bin/usr/bin/pkg1
|
||||||
|
echo 'this is the GPL' > pkg-conflict1bin/usr/share/licenses/COPYING
|
||||||
|
$OSTREE commit -b union-identical-conflictpkg1bin --tree=dir=pkg-conflict1bin
|
||||||
|
mkdir -p pkg-conflict1link/usr/{bin,share/licenses}
|
||||||
|
ln -s somewhere-else > pkg-conflict1link/usr/bin/pkg1
|
||||||
|
echo 'this is the GPL' > pkg-conflict1link/usr/share/licenses/COPYING
|
||||||
|
$OSTREE commit -b union-identical-conflictpkg1link --tree=dir=pkg-conflict1link
|
||||||
|
|
||||||
|
for v in bin link; do
|
||||||
|
rm union-identical-test -rf
|
||||||
|
$OSTREE checkout ${CHECKOUT_H_ARGS} --union-identical union-identical-pkg1 union-identical-test
|
||||||
|
if $OSTREE checkout ${CHECKOUT_H_ARGS} --union-identical union-identical-conflictpkg1${v} union-identical-test 2>err.txt; then
|
||||||
|
fatal "union identical $v succeeded?"
|
||||||
|
fi
|
||||||
|
assert_file_has_content err.txt 'error:.*File exists'
|
||||||
|
done
|
||||||
|
echo "ok checkout union identical conflicts"
|
||||||
|
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
rm files -rf && mkdir files
|
rm files -rf && mkdir files
|
||||||
mkdir files/worldwritable-dir
|
mkdir files/worldwritable-dir
|
||||||
|
|
@ -496,13 +563,16 @@ cd ${test_tmpdir}
|
||||||
$OSTREE checkout test2 --allow-noent --subpath /enoent 2>/dev/null
|
$OSTREE checkout test2 --allow-noent --subpath /enoent 2>/dev/null
|
||||||
echo "ok subdir noent"
|
echo "ok subdir noent"
|
||||||
|
|
||||||
|
if ! skip_one_without_user_xattrs; then
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
mkdir repo3
|
mkdir repo3
|
||||||
ostree_repo_init repo3 --mode=bare-user
|
ostree_repo_init repo3 --mode=bare-user
|
||||||
${CMD_PREFIX} ostree --repo=repo3 pull-local --remote=aremote repo test2
|
${CMD_PREFIX} ostree --repo=repo3 pull-local --remote=aremote repo test2
|
||||||
${CMD_PREFIX} ostree --repo=repo3 rev-parse aremote/test2
|
${CMD_PREFIX} ostree --repo=repo3 rev-parse aremote/test2
|
||||||
echo "ok pull-local with --remote arg"
|
echo "ok pull-local with --remote arg"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! skip_one_without_user_xattrs; then
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
${CMD_PREFIX} ostree --repo=repo3 prune
|
${CMD_PREFIX} ostree --repo=repo3 prune
|
||||||
find repo3/objects -name '*.commit' > objlist-before-prune
|
find repo3/objects -name '*.commit' > objlist-before-prune
|
||||||
|
|
@ -514,6 +584,7 @@ if cmp -s objlist-before-prune objlist-after-prune; then
|
||||||
fi
|
fi
|
||||||
rm repo3 objlist-before-prune objlist-after-prune -rf
|
rm repo3 objlist-before-prune objlist-after-prune -rf
|
||||||
echo "ok prune"
|
echo "ok prune"
|
||||||
|
fi
|
||||||
|
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
rm repo3 -rf
|
rm repo3 -rf
|
||||||
|
|
@ -597,6 +668,7 @@ $OSTREE show --print-detached-metadata-key=SIGNATURE test2 > test2-meta
|
||||||
assert_file_has_content test2-meta "HANCOCK"
|
assert_file_has_content test2-meta "HANCOCK"
|
||||||
echo "ok metadata commit with strings"
|
echo "ok metadata commit with strings"
|
||||||
|
|
||||||
|
if ! skip_one_without_user_xattrs; then
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
rm repo2 -rf
|
rm repo2 -rf
|
||||||
mkdir repo2
|
mkdir repo2
|
||||||
|
|
@ -605,6 +677,7 @@ ${CMD_PREFIX} ostree --repo=repo2 pull-local repo
|
||||||
${CMD_PREFIX} ostree --repo=repo2 show --print-detached-metadata-key=SIGNATURE test2 > test2-meta
|
${CMD_PREFIX} ostree --repo=repo2 show --print-detached-metadata-key=SIGNATURE test2 > test2-meta
|
||||||
assert_file_has_content test2-meta "HANCOCK"
|
assert_file_has_content test2-meta "HANCOCK"
|
||||||
echo "ok pull-local after commit metadata"
|
echo "ok pull-local after commit metadata"
|
||||||
|
fi
|
||||||
|
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
${CMD_PREFIX} ostree --repo=repo remote --set=tls-permissive=true add aremote http://remote.example.com/repo testos/buildmaster/x86_64-runtime
|
${CMD_PREFIX} ostree --repo=repo remote --set=tls-permissive=true add aremote http://remote.example.com/repo testos/buildmaster/x86_64-runtime
|
||||||
|
|
|
||||||
|
|
@ -33,9 +33,7 @@
|
||||||
gboolean
|
gboolean
|
||||||
ot_test_run_libtest (const char *cmd, GError **error)
|
ot_test_run_libtest (const char *cmd, GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
|
||||||
const char *srcdir = g_getenv ("G_TEST_SRCDIR");
|
const char *srcdir = g_getenv ("G_TEST_SRCDIR");
|
||||||
int estatus;
|
|
||||||
g_autoptr(GPtrArray) argv = g_ptr_array_new ();
|
g_autoptr(GPtrArray) argv = g_ptr_array_new ();
|
||||||
g_autoptr(GString) cmdstr = g_string_new ("");
|
g_autoptr(GString) cmdstr = g_string_new ("");
|
||||||
|
|
||||||
|
|
@ -50,53 +48,39 @@ ot_test_run_libtest (const char *cmd, GError **error)
|
||||||
g_ptr_array_add (argv, cmdstr->str);
|
g_ptr_array_add (argv, cmdstr->str);
|
||||||
g_ptr_array_add (argv, NULL);
|
g_ptr_array_add (argv, NULL);
|
||||||
|
|
||||||
|
int estatus;
|
||||||
if (!g_spawn_sync (NULL, (char**)argv->pdata, NULL, G_SPAWN_SEARCH_PATH,
|
if (!g_spawn_sync (NULL, (char**)argv->pdata, NULL, G_SPAWN_SEARCH_PATH,
|
||||||
NULL, NULL, NULL, NULL, &estatus, error))
|
NULL, NULL, NULL, NULL, &estatus, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
if (!g_spawn_check_exit_status (estatus, error))
|
if (!g_spawn_check_exit_status (estatus, error))
|
||||||
goto out;
|
return FALSE;
|
||||||
|
|
||||||
ret = TRUE;
|
return TRUE;
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OstreeRepo *
|
OstreeRepo *
|
||||||
ot_test_setup_repo (GCancellable *cancellable,
|
ot_test_setup_repo (GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
if (!ot_test_run_libtest ("setup_test_repository archive", error))
|
||||||
g_autoptr(GFile) repo_path = g_file_new_for_path ("repo");
|
|
||||||
glnx_unref_object OstreeRepo* ret_repo = NULL;
|
|
||||||
|
|
||||||
if (!ot_test_run_libtest ("setup_test_repository archive-z2", error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret_repo = ostree_repo_new (repo_path);
|
|
||||||
|
|
||||||
if (!ostree_repo_open (ret_repo, cancellable, error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
if (ret)
|
|
||||||
return g_steal_pointer (&ret_repo);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
g_autoptr(GFile) repo_path = g_file_new_for_path ("repo");
|
||||||
|
g_autoptr(OstreeRepo) ret_repo = ostree_repo_new (repo_path);
|
||||||
|
if (!ostree_repo_open (ret_repo, cancellable, error))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_steal_pointer (&ret_repo);
|
||||||
}
|
}
|
||||||
|
|
||||||
OstreeSysroot *
|
OstreeSysroot *
|
||||||
ot_test_setup_sysroot (GCancellable *cancellable,
|
ot_test_setup_sysroot (GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
gboolean ret = FALSE;
|
if (!ot_test_run_libtest ("setup_os_repository \"archive\" \"syslinux\"", error))
|
||||||
g_autoptr(GFile) sysroot_path = g_file_new_for_path ("sysroot");
|
return FALSE;
|
||||||
glnx_unref_object OstreeSysroot *ret_sysroot = NULL;
|
|
||||||
struct statfs stbuf;
|
struct statfs stbuf;
|
||||||
|
|
||||||
if (!ot_test_run_libtest ("setup_os_repository \"archive-z2\" \"syslinux\"", error))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
{ g_autoptr(GString) buf = g_string_new ("mutable-deployments");
|
{ g_autoptr(GString) buf = g_string_new ("mutable-deployments");
|
||||||
if (statfs ("/", &stbuf) < 0)
|
if (statfs ("/", &stbuf) < 0)
|
||||||
return glnx_null_throw_errno (error);
|
return glnx_null_throw_errno (error);
|
||||||
|
|
@ -113,11 +97,6 @@ ot_test_setup_sysroot (GCancellable *cancellable,
|
||||||
g_setenv ("OSTREE_SYSROOT_DEBUG", buf->str, TRUE);
|
g_setenv ("OSTREE_SYSROOT_DEBUG", buf->str, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret_sysroot = ostree_sysroot_new (sysroot_path);
|
g_autoptr(GFile) sysroot_path = g_file_new_for_path ("sysroot");
|
||||||
|
return ostree_sysroot_new (sysroot_path);
|
||||||
ret = TRUE;
|
|
||||||
out:
|
|
||||||
if (ret)
|
|
||||||
return g_steal_pointer (&ret_sysroot);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -366,7 +366,7 @@ setup_os_repository () {
|
||||||
shift
|
shift
|
||||||
bootmode=$1
|
bootmode=$1
|
||||||
shift
|
shift
|
||||||
bootdir=${1:-usr/lib/ostree-boot}
|
bootdir=${1:-usr/lib/modules/3.6.0}
|
||||||
|
|
||||||
oldpwd=`pwd`
|
oldpwd=`pwd`
|
||||||
|
|
||||||
|
|
@ -381,17 +381,25 @@ setup_os_repository () {
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
mkdir osdata
|
mkdir osdata
|
||||||
cd osdata
|
cd osdata
|
||||||
mkdir -p usr/bin usr/lib/modules/3.6.0 usr/share usr/etc
|
kver=3.6.0
|
||||||
mkdir -p ${bootdir}
|
mkdir -p usr/bin ${bootdir} usr/lib/modules/${kver} usr/share usr/etc
|
||||||
echo "a kernel" > ${bootdir}/vmlinuz-3.6.0
|
kernel_path=${bootdir}/vmlinuz
|
||||||
echo "an initramfs" > ${bootdir}/initramfs-3.6.0
|
initramfs_path=${bootdir}/initramfs.img
|
||||||
bootcsum=$(cat ${bootdir}/vmlinuz-3.6.0 ${bootdir}/initramfs-3.6.0 | sha256sum | cut -f 1 -d ' ')
|
# /usr/lib/modules just uses "vmlinuz", since the version is in the module
|
||||||
|
# directory name.
|
||||||
|
if [[ $bootdir != usr/lib/modules/* ]]; then
|
||||||
|
kernel_path=${kernel_path}-${kver}
|
||||||
|
initramfs_path=${bootdir}/initramfs-${kver}.img
|
||||||
|
fi
|
||||||
|
echo "a kernel" > ${kernel_path}
|
||||||
|
echo "an initramfs" > ${initramfs_path}
|
||||||
|
bootcsum=$(cat ${kernel_path} ${initramfs_path} | sha256sum | cut -f 1 -d ' ')
|
||||||
export bootcsum
|
export bootcsum
|
||||||
# Add the checksum for legacy dirs (/boot, /usr/lib/ostree-boot), but not
|
# Add the checksum for legacy dirs (/boot, /usr/lib/ostree-boot), but not
|
||||||
# /usr/lib/modules.
|
# /usr/lib/modules.
|
||||||
if [[ $bootdir != usr/lib/modules ]]; then
|
if [[ $bootdir != usr/lib/modules/* ]]; then
|
||||||
mv ${bootdir}/vmlinuz-3.6.0{,-${bootcsum}}
|
mv ${kernel_path}{,-${bootcsum}}
|
||||||
mv ${bootdir}/initramfs-3.6.0{,-${bootcsum}}
|
mv ${initramfs_path}{,-${bootcsum}}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "an executable" > usr/bin/sh
|
echo "an executable" > usr/bin/sh
|
||||||
|
|
@ -465,17 +473,31 @@ os_repository_new_commit ()
|
||||||
branch=${3:-testos/buildmaster/x86_64-runtime}
|
branch=${3:-testos/buildmaster/x86_64-runtime}
|
||||||
echo "BOOT ITERATION: $boot_checksum_iteration"
|
echo "BOOT ITERATION: $boot_checksum_iteration"
|
||||||
cd ${test_tmpdir}/osdata
|
cd ${test_tmpdir}/osdata
|
||||||
|
kver=3.6.0
|
||||||
|
if test -f usr/lib/modules/${kver}/vmlinuz; then
|
||||||
|
bootdir=usr/lib/modules/${kver}
|
||||||
|
else
|
||||||
|
if test -d usr/lib/ostree-boot; then
|
||||||
bootdir=usr/lib/ostree-boot
|
bootdir=usr/lib/ostree-boot
|
||||||
if ! test -d ${bootdir}; then
|
else
|
||||||
bootdir=boot
|
bootdir=boot
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
rm ${bootdir}/*
|
rm ${bootdir}/*
|
||||||
echo "new: a kernel ${boot_checksum_iteration}" > ${bootdir}/vmlinuz-3.6.0
|
kernel_path=${bootdir}/vmlinuz
|
||||||
echo "new: an initramfs ${boot_checksum_iteration}" > ${bootdir}/initramfs-3.6.0
|
initramfs_path=${bootdir}/initramfs.img
|
||||||
bootcsum=$(cat ${bootdir}/vmlinuz-3.6.0 ${bootdir}/initramfs-3.6.0 | sha256sum | cut -f 1 -d ' ')
|
if [[ $bootdir != usr/lib/modules/* ]]; then
|
||||||
|
kernel_path=${kernel_path}-${kver}
|
||||||
|
initramfs_path=${bootdir}/initramfs-${kver}.img
|
||||||
|
fi
|
||||||
|
echo "new: a kernel ${boot_checksum_iteration}" > ${kernel_path}
|
||||||
|
echo "new: an initramfs ${boot_checksum_iteration}" > ${initramfs_path}
|
||||||
|
bootcsum=$(cat ${kernel_path} ${initramfs_path} | sha256sum | cut -f 1 -d ' ')
|
||||||
export bootcsum
|
export bootcsum
|
||||||
mv ${bootdir}/vmlinuz-3.6.0 ${bootdir}/vmlinuz-3.6.0-${bootcsum}
|
if [[ $bootdir != usr/lib/modules/* ]]; then
|
||||||
mv ${bootdir}/initramfs-3.6.0 ${bootdir}/initramfs-3.6.0-${bootcsum}
|
mv ${kernel_path}{,-${bootcsum}}
|
||||||
|
mv ${initramfs_path}{,-${bootcsum}}
|
||||||
|
fi
|
||||||
|
|
||||||
echo "a new default config file" > usr/etc/a-new-default-config-file
|
echo "a new default config file" > usr/etc/a-new-default-config-file
|
||||||
mkdir -p usr/etc/new-default-dir
|
mkdir -p usr/etc/new-default-dir
|
||||||
|
|
@ -489,6 +511,17 @@ os_repository_new_commit ()
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Usage: if ! skip_one_without_user_xattrs; then ... more tests ...; fi
|
||||||
|
skip_one_without_user_xattrs () {
|
||||||
|
touch test-xattrs
|
||||||
|
if ! setfattr -n user.testvalue -v somevalue test-xattrs; then
|
||||||
|
echo "ok # SKIP - this test requires xattr support"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
skip_without_user_xattrs () {
|
skip_without_user_xattrs () {
|
||||||
touch test-xattrs
|
touch test-xattrs
|
||||||
setfattr -n user.testvalue -v somevalue test-xattrs || \
|
setfattr -n user.testvalue -v somevalue test-xattrs || \
|
||||||
|
|
@ -528,6 +561,14 @@ ostree_file_path_to_checksum() {
|
||||||
$CMD_PREFIX ostree --repo=$repo ls -C $ref $path | awk '{ print $5 }'
|
$CMD_PREFIX ostree --repo=$repo ls -C $ref $path | awk '{ print $5 }'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Given an object checksum, print its relative file path
|
||||||
|
ostree_checksum_to_relative_object_path() {
|
||||||
|
repo=$1
|
||||||
|
checksum=$2
|
||||||
|
if grep -Eq -e '^mode=archive' ${repo}/config; then suffix=z; else suffix=''; fi
|
||||||
|
echo objects/${checksum:0:2}/${checksum:2}.file${suffix}
|
||||||
|
}
|
||||||
|
|
||||||
# Given a path to a file in a repo for a ref, print the (relative) path to its
|
# Given a path to a file in a repo for a ref, print the (relative) path to its
|
||||||
# object
|
# object
|
||||||
ostree_file_path_to_relative_object_path() {
|
ostree_file_path_to_relative_object_path() {
|
||||||
|
|
@ -536,7 +577,7 @@ ostree_file_path_to_relative_object_path() {
|
||||||
path=$3
|
path=$3
|
||||||
checksum=$(ostree_file_path_to_checksum $repo $ref $path)
|
checksum=$(ostree_file_path_to_checksum $repo $ref $path)
|
||||||
test -n "${checksum}"
|
test -n "${checksum}"
|
||||||
echo objects/${checksum:0:2}/${checksum:2}.file
|
ostree_checksum_to_relative_object_path ${repo} ${checksum}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Given a path to a file in a repo for a ref, print the path to its object
|
# Given a path to a file in a repo for a ref, print the path to its object
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ function verify_initial_contents() {
|
||||||
assert_file_has_content baz/cow '^moo$'
|
assert_file_has_content baz/cow '^moo$'
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "1..28"
|
echo "1..29"
|
||||||
|
|
||||||
# Try both syntaxes
|
# Try both syntaxes
|
||||||
repo_init --no-gpg-verify
|
repo_init --no-gpg-verify
|
||||||
|
|
@ -205,6 +205,31 @@ ${CMD_PREFIX} ostree --repo=parentpullrepo rev-parse origin:main > main.txt
|
||||||
assert_file_has_content main.txt ${rev}
|
assert_file_has_content main.txt ${rev}
|
||||||
echo "ok pull specific commit"
|
echo "ok pull specific commit"
|
||||||
|
|
||||||
|
# test pull -T
|
||||||
|
cd ${test_tmpdir}
|
||||||
|
repo_init --no-gpg-verify
|
||||||
|
${CMD_PREFIX} ostree --repo=repo pull origin main
|
||||||
|
origrev=$(${CMD_PREFIX} ostree --repo=repo rev-parse main)
|
||||||
|
# Check we can pull the same commit with timestamp checking enabled
|
||||||
|
${CMD_PREFIX} ostree --repo=repo pull -T origin main
|
||||||
|
assert_streq ${origrev} "$(${CMD_PREFIX} ostree --repo=repo rev-parse main)"
|
||||||
|
newrev=$(${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo commit -b main --tree=ref=main)
|
||||||
|
${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u
|
||||||
|
# New commit with timestamp checking
|
||||||
|
${CMD_PREFIX} ostree --repo=repo pull -T origin main
|
||||||
|
assert_not_streq "${origrev}" "${newrev}"
|
||||||
|
assert_streq ${newrev} "$(${CMD_PREFIX} ostree --repo=repo rev-parse main)"
|
||||||
|
newrev2=$(${CMD_PREFIX} ostree --timestamp="October 25 1985" --repo=ostree-srv/gnomerepo commit -b main --tree=ref=main)
|
||||||
|
${CMD_PREFIX} ostree --repo=ostree-srv/gnomerepo summary -u
|
||||||
|
if ${CMD_PREFIX} ostree --repo=repo pull -T origin main 2>err.txt; then
|
||||||
|
fatal "pulled older commit with timestamp checking enabled?"
|
||||||
|
fi
|
||||||
|
assert_file_has_content err.txt "Upgrade.*is chronologically older"
|
||||||
|
assert_streq ${newrev} "$(${CMD_PREFIX} ostree --repo=repo rev-parse main)"
|
||||||
|
# But we can pull it without timestamp checking
|
||||||
|
${CMD_PREFIX} ostree --repo=repo pull origin main
|
||||||
|
echo "ok pull timestamp checking"
|
||||||
|
|
||||||
cd ${test_tmpdir}
|
cd ${test_tmpdir}
|
||||||
repo_init --no-gpg-verify
|
repo_init --no-gpg-verify
|
||||||
${CMD_PREFIX} ostree --repo=repo pull origin main
|
${CMD_PREFIX} ostree --repo=repo pull origin main
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ set -euo pipefail
|
||||||
. $(dirname $0)/libtest.sh
|
. $(dirname $0)/libtest.sh
|
||||||
|
|
||||||
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
||||||
setup_os_repository "archive-z2" "syslinux"
|
setup_os_repository "archive" "syslinux"
|
||||||
|
|
||||||
echo "1..3"
|
echo "1..3"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ set -euo pipefail
|
||||||
. $(dirname $0)/libtest.sh
|
. $(dirname $0)/libtest.sh
|
||||||
|
|
||||||
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
||||||
setup_os_repository "archive-z2" "syslinux"
|
setup_os_repository "archive" "syslinux"
|
||||||
|
|
||||||
echo "1..1"
|
echo "1..1"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ set -euo pipefail
|
||||||
. $(dirname $0)/libtest.sh
|
. $(dirname $0)/libtest.sh
|
||||||
|
|
||||||
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
||||||
setup_os_repository "archive-z2" "syslinux"
|
setup_os_repository "archive" "syslinux"
|
||||||
|
|
||||||
echo "1..1"
|
echo "1..1"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ set -euo pipefail
|
||||||
. $(dirname $0)/libtest.sh
|
. $(dirname $0)/libtest.sh
|
||||||
|
|
||||||
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
||||||
setup_os_repository "archive-z2" "syslinux"
|
setup_os_repository "archive" "syslinux"
|
||||||
|
|
||||||
echo "1..2"
|
echo "1..2"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,11 @@
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
echo "1..19"
|
|
||||||
|
|
||||||
. $(dirname $0)/libtest.sh
|
. $(dirname $0)/libtest.sh
|
||||||
|
|
||||||
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
||||||
setup_os_repository "archive-z2" "grub2 ostree-grub-generator"
|
setup_os_repository "archive" "grub2 ostree-grub-generator"
|
||||||
|
|
||||||
|
extra_admin_tests=0
|
||||||
|
|
||||||
. $(dirname $0)/admin-test.sh
|
. $(dirname $0)/admin-test.sh
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ set -euo pipefail
|
||||||
. $(dirname $0)/libtest.sh
|
. $(dirname $0)/libtest.sh
|
||||||
|
|
||||||
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
# Exports OSTREE_SYSROOT so --sysroot not needed.
|
||||||
setup_os_repository "archive-z2" "syslinux"
|
setup_os_repository "archive" "syslinux"
|
||||||
|
|
||||||
echo "1..3"
|
echo "1..3"
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue