From 6cb1a8772364e96e62cfda74490db9848c885635 Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Fri, 19 Sep 2014 12:22:35 +0100 Subject: Allow replacing a file with a compatibility symlink This means we can do stuff like moving /etc/os-release into /usr/lib and leaving a compatibility symlink where the file was. Previously baserock-system-config-sync would fail with the following: ERROR: found two different types for 'os-release': regular and symlink One of the 'failure' test cases now passes, and I've added a specific test for our 'os-release' case to the 'symblinks' test case too. --- baserock-system-config-sync/baserock-system-config-sync | 13 +++++++++++-- tests/bscs-merge.fail/regular.symb.in/systems/default | 1 - .../regular.symb.in/systems/factory/orig/etc/1 | 0 .../regular.symb.in/systems/factory/run/etc/1 | 1 - .../regular.symb.in/systems/factory/run/etc/afile | 0 .../regular.symb.in/systems/version2/orig/etc/1 | 0 .../regular.symb.in/systems/version2/run/etc/1 | 0 tests/bscs-merge.pass/regular.symb.in/systems/default | 1 + .../regular.symb.in/systems/factory/orig/etc/1 | 0 .../regular.symb.in/systems/factory/run/etc/1 | 1 + .../regular.symb.in/systems/factory/run/etc/afile | 0 .../regular.symb.in/systems/version2/orig/etc/1 | 0 .../regular.symb.in/systems/version2/run/etc/1 | 0 tests/bscs-merge.pass/regular.symb.out/systems/default | 1 + .../regular.symb.out/systems/factory/orig/etc/1 | 0 .../regular.symb.out/systems/factory/run/etc/1 | 1 + .../regular.symb.out/systems/factory/run/etc/afile | 0 .../regular.symb.out/systems/version2/orig/etc/1 | 0 .../regular.symb.out/systems/version2/run/etc/1 | 0 .../regular.symb.out/systems/version2/run/etc/afile | 0 .../symblinks.in/systems/factory/orig/etc/os-release | 2 ++ .../symblinks.in/systems/factory/run/etc/os-release | 2 ++ .../symblinks.in/systems/version2/orig/etc/os-release | 1 + .../symblinks.in/systems/version2/orig/usr/lib/os-release | 2 ++ .../symblinks.in/systems/version2/run/etc/os-release | 1 + .../symblinks.in/systems/version2/run/usr/lib/os-release | 2 ++ .../symblinks.out/systems/factory/orig/etc/os-release | 2 ++ .../symblinks.out/systems/factory/run/etc/os-release | 2 ++ .../symblinks.out/systems/version2/orig/etc/os-release | 1 + .../symblinks.out/systems/version2/orig/usr/lib/os-release | 2 ++ .../symblinks.out/systems/version2/run/etc/os-release | 1 + .../symblinks.out/systems/version2/run/usr/lib/os-release | 2 ++ 32 files changed, 35 insertions(+), 4 deletions(-) delete mode 120000 tests/bscs-merge.fail/regular.symb.in/systems/default delete mode 100644 tests/bscs-merge.fail/regular.symb.in/systems/factory/orig/etc/1 delete mode 120000 tests/bscs-merge.fail/regular.symb.in/systems/factory/run/etc/1 delete mode 100644 tests/bscs-merge.fail/regular.symb.in/systems/factory/run/etc/afile delete mode 100644 tests/bscs-merge.fail/regular.symb.in/systems/version2/orig/etc/1 delete mode 100644 tests/bscs-merge.fail/regular.symb.in/systems/version2/run/etc/1 create mode 120000 tests/bscs-merge.pass/regular.symb.in/systems/default create mode 100644 tests/bscs-merge.pass/regular.symb.in/systems/factory/orig/etc/1 create mode 120000 tests/bscs-merge.pass/regular.symb.in/systems/factory/run/etc/1 create mode 100644 tests/bscs-merge.pass/regular.symb.in/systems/factory/run/etc/afile create mode 100644 tests/bscs-merge.pass/regular.symb.in/systems/version2/orig/etc/1 create mode 100644 tests/bscs-merge.pass/regular.symb.in/systems/version2/run/etc/1 create mode 120000 tests/bscs-merge.pass/regular.symb.out/systems/default create mode 100644 tests/bscs-merge.pass/regular.symb.out/systems/factory/orig/etc/1 create mode 120000 tests/bscs-merge.pass/regular.symb.out/systems/factory/run/etc/1 create mode 100644 tests/bscs-merge.pass/regular.symb.out/systems/factory/run/etc/afile create mode 100644 tests/bscs-merge.pass/regular.symb.out/systems/version2/orig/etc/1 create mode 100644 tests/bscs-merge.pass/regular.symb.out/systems/version2/run/etc/1 create mode 100644 tests/bscs-merge.pass/regular.symb.out/systems/version2/run/etc/afile create mode 100644 tests/bscs-merge.pass/symblinks.in/systems/factory/orig/etc/os-release create mode 100644 tests/bscs-merge.pass/symblinks.in/systems/factory/run/etc/os-release create mode 120000 tests/bscs-merge.pass/symblinks.in/systems/version2/orig/etc/os-release create mode 100644 tests/bscs-merge.pass/symblinks.in/systems/version2/orig/usr/lib/os-release create mode 120000 tests/bscs-merge.pass/symblinks.in/systems/version2/run/etc/os-release create mode 100644 tests/bscs-merge.pass/symblinks.in/systems/version2/run/usr/lib/os-release create mode 100644 tests/bscs-merge.pass/symblinks.out/systems/factory/orig/etc/os-release create mode 100644 tests/bscs-merge.pass/symblinks.out/systems/factory/run/etc/os-release create mode 120000 tests/bscs-merge.pass/symblinks.out/systems/version2/orig/etc/os-release create mode 100644 tests/bscs-merge.pass/symblinks.out/systems/version2/orig/usr/lib/os-release create mode 120000 tests/bscs-merge.pass/symblinks.out/systems/version2/run/etc/os-release create mode 100644 tests/bscs-merge.pass/symblinks.out/systems/version2/run/usr/lib/os-release diff --git a/baserock-system-config-sync/baserock-system-config-sync b/baserock-system-config-sync/baserock-system-config-sync index 7b7c697..2cd9807 100755 --- a/baserock-system-config-sync/baserock-system-config-sync +++ b/baserock-system-config-sync/baserock-system-config-sync @@ -54,8 +54,17 @@ check_same_type() { type1="$(file_type $1)" type2="$(file_type $2)" if [ "$type1" != "$type2" ]; then - die "ERROR: found two different types for '$3':" \ - "$type1 and $type2" + if [ "$type1" == symlink ] || [ "$type2" == symlink ]; then + # We allow moving content and leaving a compatibility symlink, as + # long as the content of the file didn't change. + if ! cmp -s "$1" "$2"; then + die "ERROR: $3: replacing a file with a symlink is only " \ + "supported if there are no changes to the content." + fi + else + die "ERROR: found two different types for '$3':" \ + "$type1 and $type2" + fi fi } diff --git a/tests/bscs-merge.fail/regular.symb.in/systems/default b/tests/bscs-merge.fail/regular.symb.in/systems/default deleted file mode 120000 index 0f51808..0000000 --- a/tests/bscs-merge.fail/regular.symb.in/systems/default +++ /dev/null @@ -1 +0,0 @@ -factory \ No newline at end of file diff --git a/tests/bscs-merge.fail/regular.symb.in/systems/factory/orig/etc/1 b/tests/bscs-merge.fail/regular.symb.in/systems/factory/orig/etc/1 deleted file mode 100644 index e69de29..0000000 diff --git a/tests/bscs-merge.fail/regular.symb.in/systems/factory/run/etc/1 b/tests/bscs-merge.fail/regular.symb.in/systems/factory/run/etc/1 deleted file mode 120000 index 6a93f4f..0000000 --- a/tests/bscs-merge.fail/regular.symb.in/systems/factory/run/etc/1 +++ /dev/null @@ -1 +0,0 @@ -afile \ No newline at end of file diff --git a/tests/bscs-merge.fail/regular.symb.in/systems/factory/run/etc/afile b/tests/bscs-merge.fail/regular.symb.in/systems/factory/run/etc/afile deleted file mode 100644 index e69de29..0000000 diff --git a/tests/bscs-merge.fail/regular.symb.in/systems/version2/orig/etc/1 b/tests/bscs-merge.fail/regular.symb.in/systems/version2/orig/etc/1 deleted file mode 100644 index e69de29..0000000 diff --git a/tests/bscs-merge.fail/regular.symb.in/systems/version2/run/etc/1 b/tests/bscs-merge.fail/regular.symb.in/systems/version2/run/etc/1 deleted file mode 100644 index e69de29..0000000 diff --git a/tests/bscs-merge.pass/regular.symb.in/systems/default b/tests/bscs-merge.pass/regular.symb.in/systems/default new file mode 120000 index 0000000..0f51808 --- /dev/null +++ b/tests/bscs-merge.pass/regular.symb.in/systems/default @@ -0,0 +1 @@ +factory \ No newline at end of file diff --git a/tests/bscs-merge.pass/regular.symb.in/systems/factory/orig/etc/1 b/tests/bscs-merge.pass/regular.symb.in/systems/factory/orig/etc/1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/regular.symb.in/systems/factory/run/etc/1 b/tests/bscs-merge.pass/regular.symb.in/systems/factory/run/etc/1 new file mode 120000 index 0000000..6a93f4f --- /dev/null +++ b/tests/bscs-merge.pass/regular.symb.in/systems/factory/run/etc/1 @@ -0,0 +1 @@ +afile \ No newline at end of file diff --git a/tests/bscs-merge.pass/regular.symb.in/systems/factory/run/etc/afile b/tests/bscs-merge.pass/regular.symb.in/systems/factory/run/etc/afile new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/regular.symb.in/systems/version2/orig/etc/1 b/tests/bscs-merge.pass/regular.symb.in/systems/version2/orig/etc/1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/regular.symb.in/systems/version2/run/etc/1 b/tests/bscs-merge.pass/regular.symb.in/systems/version2/run/etc/1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/regular.symb.out/systems/default b/tests/bscs-merge.pass/regular.symb.out/systems/default new file mode 120000 index 0000000..0f51808 --- /dev/null +++ b/tests/bscs-merge.pass/regular.symb.out/systems/default @@ -0,0 +1 @@ +factory \ No newline at end of file diff --git a/tests/bscs-merge.pass/regular.symb.out/systems/factory/orig/etc/1 b/tests/bscs-merge.pass/regular.symb.out/systems/factory/orig/etc/1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/regular.symb.out/systems/factory/run/etc/1 b/tests/bscs-merge.pass/regular.symb.out/systems/factory/run/etc/1 new file mode 120000 index 0000000..6a93f4f --- /dev/null +++ b/tests/bscs-merge.pass/regular.symb.out/systems/factory/run/etc/1 @@ -0,0 +1 @@ +afile \ No newline at end of file diff --git a/tests/bscs-merge.pass/regular.symb.out/systems/factory/run/etc/afile b/tests/bscs-merge.pass/regular.symb.out/systems/factory/run/etc/afile new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/regular.symb.out/systems/version2/orig/etc/1 b/tests/bscs-merge.pass/regular.symb.out/systems/version2/orig/etc/1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/regular.symb.out/systems/version2/run/etc/1 b/tests/bscs-merge.pass/regular.symb.out/systems/version2/run/etc/1 new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/regular.symb.out/systems/version2/run/etc/afile b/tests/bscs-merge.pass/regular.symb.out/systems/version2/run/etc/afile new file mode 100644 index 0000000..e69de29 diff --git a/tests/bscs-merge.pass/symblinks.in/systems/factory/orig/etc/os-release b/tests/bscs-merge.pass/symblinks.in/systems/factory/orig/etc/os-release new file mode 100644 index 0000000..39715ee --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.in/systems/factory/orig/etc/os-release @@ -0,0 +1,2 @@ +Hi, I'm 'os-release'. I start out living in /etc, but then I get moved to +/usr/lib and I'm replaced with a compatibility symlink. diff --git a/tests/bscs-merge.pass/symblinks.in/systems/factory/run/etc/os-release b/tests/bscs-merge.pass/symblinks.in/systems/factory/run/etc/os-release new file mode 100644 index 0000000..39715ee --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.in/systems/factory/run/etc/os-release @@ -0,0 +1,2 @@ +Hi, I'm 'os-release'. I start out living in /etc, but then I get moved to +/usr/lib and I'm replaced with a compatibility symlink. diff --git a/tests/bscs-merge.pass/symblinks.in/systems/version2/orig/etc/os-release b/tests/bscs-merge.pass/symblinks.in/systems/version2/orig/etc/os-release new file mode 120000 index 0000000..c4c75b4 --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.in/systems/version2/orig/etc/os-release @@ -0,0 +1 @@ +../usr/lib/os-release \ No newline at end of file diff --git a/tests/bscs-merge.pass/symblinks.in/systems/version2/orig/usr/lib/os-release b/tests/bscs-merge.pass/symblinks.in/systems/version2/orig/usr/lib/os-release new file mode 100644 index 0000000..39715ee --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.in/systems/version2/orig/usr/lib/os-release @@ -0,0 +1,2 @@ +Hi, I'm 'os-release'. I start out living in /etc, but then I get moved to +/usr/lib and I'm replaced with a compatibility symlink. diff --git a/tests/bscs-merge.pass/symblinks.in/systems/version2/run/etc/os-release b/tests/bscs-merge.pass/symblinks.in/systems/version2/run/etc/os-release new file mode 120000 index 0000000..c4c75b4 --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.in/systems/version2/run/etc/os-release @@ -0,0 +1 @@ +../usr/lib/os-release \ No newline at end of file diff --git a/tests/bscs-merge.pass/symblinks.in/systems/version2/run/usr/lib/os-release b/tests/bscs-merge.pass/symblinks.in/systems/version2/run/usr/lib/os-release new file mode 100644 index 0000000..39715ee --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.in/systems/version2/run/usr/lib/os-release @@ -0,0 +1,2 @@ +Hi, I'm 'os-release'. I start out living in /etc, but then I get moved to +/usr/lib and I'm replaced with a compatibility symlink. diff --git a/tests/bscs-merge.pass/symblinks.out/systems/factory/orig/etc/os-release b/tests/bscs-merge.pass/symblinks.out/systems/factory/orig/etc/os-release new file mode 100644 index 0000000..39715ee --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.out/systems/factory/orig/etc/os-release @@ -0,0 +1,2 @@ +Hi, I'm 'os-release'. I start out living in /etc, but then I get moved to +/usr/lib and I'm replaced with a compatibility symlink. diff --git a/tests/bscs-merge.pass/symblinks.out/systems/factory/run/etc/os-release b/tests/bscs-merge.pass/symblinks.out/systems/factory/run/etc/os-release new file mode 100644 index 0000000..39715ee --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.out/systems/factory/run/etc/os-release @@ -0,0 +1,2 @@ +Hi, I'm 'os-release'. I start out living in /etc, but then I get moved to +/usr/lib and I'm replaced with a compatibility symlink. diff --git a/tests/bscs-merge.pass/symblinks.out/systems/version2/orig/etc/os-release b/tests/bscs-merge.pass/symblinks.out/systems/version2/orig/etc/os-release new file mode 120000 index 0000000..c4c75b4 --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.out/systems/version2/orig/etc/os-release @@ -0,0 +1 @@ +../usr/lib/os-release \ No newline at end of file diff --git a/tests/bscs-merge.pass/symblinks.out/systems/version2/orig/usr/lib/os-release b/tests/bscs-merge.pass/symblinks.out/systems/version2/orig/usr/lib/os-release new file mode 100644 index 0000000..39715ee --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.out/systems/version2/orig/usr/lib/os-release @@ -0,0 +1,2 @@ +Hi, I'm 'os-release'. I start out living in /etc, but then I get moved to +/usr/lib and I'm replaced with a compatibility symlink. diff --git a/tests/bscs-merge.pass/symblinks.out/systems/version2/run/etc/os-release b/tests/bscs-merge.pass/symblinks.out/systems/version2/run/etc/os-release new file mode 120000 index 0000000..c4c75b4 --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.out/systems/version2/run/etc/os-release @@ -0,0 +1 @@ +../usr/lib/os-release \ No newline at end of file diff --git a/tests/bscs-merge.pass/symblinks.out/systems/version2/run/usr/lib/os-release b/tests/bscs-merge.pass/symblinks.out/systems/version2/run/usr/lib/os-release new file mode 100644 index 0000000..39715ee --- /dev/null +++ b/tests/bscs-merge.pass/symblinks.out/systems/version2/run/usr/lib/os-release @@ -0,0 +1,2 @@ +Hi, I'm 'os-release'. I start out living in /etc, but then I get moved to +/usr/lib and I'm replaced with a compatibility symlink. -- cgit v1.2.1 From fef35900a703ac8401e60a2fb89166b3a7e7a27b Mon Sep 17 00:00:00 2001 From: Sam Thursfield Date: Tue, 23 Sep 2014 11:47:42 +0100 Subject: Use = not == with `test` to be POSIX compatible --- baserock-system-config-sync/baserock-system-config-sync | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/baserock-system-config-sync/baserock-system-config-sync b/baserock-system-config-sync/baserock-system-config-sync index 2cd9807..061c86c 100755 --- a/baserock-system-config-sync/baserock-system-config-sync +++ b/baserock-system-config-sync/baserock-system-config-sync @@ -54,7 +54,7 @@ check_same_type() { type1="$(file_type $1)" type2="$(file_type $2)" if [ "$type1" != "$type2" ]; then - if [ "$type1" == symlink ] || [ "$type2" == symlink ]; then + if [ "$type1" = symlink ] || [ "$type2" = symlink ]; then # We allow moving content and leaving a compatibility symlink, as # long as the content of the file didn't change. if ! cmp -s "$1" "$2"; then -- cgit v1.2.1