Revision: 899 http://trac.macosforge.org/projects/darwinbuild/changeset/899 Author: wsiegrist@apple.com Date: 2010-10-27 15:25:54 -0700 (Wed, 27 Oct 2010) Log Message: ----------- Merge PR-8488185 Modified Paths: -------------- trunk/darwinup/Depot.cpp trunk/darwinup/Depot.h trunk/darwinup/darwinup.1 trunk/darwinup/main.cpp trunk/testing/darwinup/run-tests.sh Added Paths: ----------- trunk/testing/darwinup/corrupt.tgz trunk/testing/darwinup/depotroot.tar.gz Property Changed: ---------------- trunk/ Property changes on: trunk ___________________________________________________________________ Modified: svn:mergeinfo - /branches/PR-4841388:399-419 /branches/PR-6358021:442-443 /branches/PR-6392966:423-427 /branches/PR-6398060:433-434 /branches/PR-6493844:460-461 /branches/PR-6497694:466-468,471 /branches/PR-6634286:632-650 /branches/PR-6688645:479-490 /branches/PR-6722857:495-499 /branches/PR-6729491:655-664 /branches/PR-6973110:804-813 /branches/PR-7250612:635-650 /branches/PR-7341154:682-694 /branches/PR-7431723:660-664 /branches/PR-7461534:650-664 /branches/PR-7482850:670-671 /branches/PR-7489777:676-731 /branches/PR-7529688:692-694 /branches/PR-7593824:739-772 /branches/PR-7598640:703-731 /branches/PR-7748469:777-785 /branches/PR-7765119:790-791 /branches/PR-7798586:796-799 /branches/PR-7872907:830-840 /branches/PR-7935095:819-821 /branches/PR-8116613:849 /branches/PR-8279204:854-862 /branches/PR-8416637:870-880 /branches/PR-8486662:885-889 + /branches/PR-4841388:399-419 /branches/PR-6358021:442-443 /branches/PR-6392966:423-427 /branches/PR-6398060:433-434 /branches/PR-6493844:460-461 /branches/PR-6497694:466-468,471 /branches/PR-6634286:632-650 /branches/PR-6688645:479-490 /branches/PR-6722857:495-499 /branches/PR-6729491:655-664 /branches/PR-6973110:804-813 /branches/PR-7250612:635-650 /branches/PR-7341154:682-694 /branches/PR-7431723:660-664 /branches/PR-7461534:650-664 /branches/PR-7482850:670-671 /branches/PR-7489777:676-731 /branches/PR-7529688:692-694 /branches/PR-7593824:739-772 /branches/PR-7598640:703-731 /branches/PR-7748469:777-785 /branches/PR-7765119:790-791 /branches/PR-7798586:796-799 /branches/PR-7872907:830-840 /branches/PR-7935095:819-821 /branches/PR-8116613:849 /branches/PR-8279204:854-862 /branches/PR-8416637:870-880 /branches/PR-8486662:885-889 /branches/PR-8488185:894-898 Modified: trunk/darwinup/Depot.cpp =================================================================== --- trunk/darwinup/Depot.cpp 2010-10-26 20:52:23 UTC (rev 898) +++ trunk/darwinup/Depot.cpp 2010-10-27 22:25:54 UTC (rev 899) @@ -426,6 +426,12 @@ IF_DEBUG("[analyze] %s\n", file->path()); + if (strcasestr(file->path(), ".DarwinDepot")) { + fprintf(stderr, "Error: Root contains a .DarwinDepot, " + "aborting to avoid damaging darwinup metadata.\n"); + return DEPOT_ERROR; + } + // Perform a three-way-diff between the file to be installed (file), // the file we last installed in this location (preceding), // and the file that actually exists in this location (actual). @@ -688,8 +694,9 @@ fprintf(stdout, "%s\n", uuid); } else { fprintf(stderr, "Error: Install failed.\n"); - if (res != DEPOT_OBJ_CHANGE) { + if (res != DEPOT_OBJ_CHANGE && res != DEPOT_PREINSTALL_ERR) { // object change errors come from analyze stage, + // and pre-install errors happen early, // so there is no installation to roll back fprintf(stderr, "Rolling back installation.\n"); res = this->uninstall(archive); @@ -763,6 +770,10 @@ remove_directory(rollback_path); free(rollback_path); free(archive_path); + if (!dryrun && res) { + this->rollback_transaction(); + return DEPOT_PREINSTALL_ERR; + } return res; } Modified: trunk/darwinup/Depot.h =================================================================== --- trunk/darwinup/Depot.h 2010-10-26 20:52:23 UTC (rev 898) +++ trunk/darwinup/Depot.h 2010-10-27 22:25:54 UTC (rev 899) @@ -46,6 +46,7 @@ #define DEPOT_OBJ_CHANGE -4 #define DEPOT_BUILD_MISMATCH -5 #define DEPOT_USAGE_ERROR -6 +#define DEPOT_PREINSTALL_ERR -7 struct Archive; Modified: trunk/darwinup/darwinup.1 =================================================================== --- trunk/darwinup/darwinup.1 2010-10-26 20:52:23 UTC (rev 898) +++ trunk/darwinup/darwinup.1 2010-10-27 22:25:54 UTC (rev 899) @@ -134,19 +134,19 @@ .El .Sh SUPPORTED PATHS .Bl -tag -width -indent -.It /path/to/local/file-or-directory -You can install files from one of your locally mounted filesystems. The path -can be a directory, in which case all files below it will be installed, or -it can be a archive file. The supported file formats are listed in the usage -statement, but typical formats are .tgz, .tbz2, or .zip. -.It user@host:/path/to/remote/file-or-directory -You can install files from a remote machine via rsync/ssh. The remote files -will be copied to your local depot and then installed like any other local -root. -.It http[s]://host/path/to/remote/file +.It /path/to/file-or-directory +You can install archive files or directories by specifying a relative or +absolute path. If the path is a directory, all files below it will be +installed as a single root. If the path points to a file, it must be one of +the suported archive file types as described in the usage statement. +.It user@host:/path/to/file-or-directory +You can install files or directories from another host via rsync/ssh. +The files/directories will be downloaded to your machine and then installed +like any other root. +.It http[s]://host/path/to/file You can install files from an archive hosted on an HTTP/HTTPS server. The -archive file will be downloaded using curl to your local depot and then -installed like any other local archive. You can not point darwinup at a +archive file will be downloaded using curl to your machine and then +installed like any other archive file. You can not point darwinup at a directory hosted via HTTP or HTTPS, only archive files such as tarballs. .El .Sh ARCHIVE SPECIFICATIONS Modified: trunk/darwinup/main.cpp =================================================================== --- trunk/darwinup/main.cpp 2010-10-26 20:52:23 UTC (rev 898) +++ trunk/darwinup/main.cpp 2010-10-27 22:25:54 UTC (rev 899) @@ -211,7 +211,23 @@ for (int i = 1; i < argc && res == 0; i++) { if (strcmp(argv[0], "install") == 0) { if (i==1 && depot->initialize(true)) exit(13); - res = depot->install(argv[i]); + // gaurd against installing paths ontop of themselves + if (strncmp(path, argv[i], strlen(argv[i])) == 0 + && (strlen(path) == strlen(argv[i]) + || strlen(path) - 1 == strlen(argv[i]))) { + if (strncmp(path, "/", 1) == 0 && strlen(path) == 1) { + fprintf(stderr, "Error: You provided '/' as a path to a root. " + "If you meant to specify a destination of '/', then you " + "just need to remove the '/' argument as the destination " + "defaults to '/'. Use the -p option to specify another " + "destination.\n"); + } else { + fprintf(stderr, "Error: You cannot install the root at '%s' onto" + " itself.\n", path); + } + res = DEPOT_ERROR; + } + if (res == 0) res = depot->install(argv[i]); } else if (strcmp(argv[0], "upgrade") == 0) { if (i==1 && depot->initialize(true)) exit(14); // find most recent matching archive by name Copied: trunk/testing/darwinup/corrupt.tgz (from rev 898, branches/PR-8488185/testing/darwinup/corrupt.tgz) =================================================================== --- trunk/testing/darwinup/corrupt.tgz (rev 0) +++ trunk/testing/darwinup/corrupt.tgz 2010-10-27 22:25:54 UTC (rev 899) @@ -0,0 +1,2 @@ +This is a text file. Darwinup will see the .tgz extension and try to use tar on it. +This will fail, which allows us to test early failures from external tools (like ditto and tar). Copied: trunk/testing/darwinup/depotroot.tar.gz (from rev 898, branches/PR-8488185/testing/darwinup/depotroot.tar.gz) =================================================================== (Binary files differ) Modified: trunk/testing/darwinup/run-tests.sh =================================================================== --- trunk/testing/darwinup/run-tests.sh 2010-10-26 20:52:23 UTC (rev 898) +++ trunk/testing/darwinup/run-tests.sh 2010-10-27 22:25:54 UTC (rev 899) @@ -62,6 +62,9 @@ cp $R $PREFIX/ done; +cp corrupt.tgz $PREFIX/ +cp depotroot.tar.gz $PREFIX/ + mkdir -p $ORIG cp -R $DEST/* $ORIG/ @@ -426,6 +429,33 @@ echo "========== Expected Failures ==========" set +e +echo "========== TEST: testing early ditto failure =========="; + +$DARWINUP install $PREFIX/corrupt.tgz | tee $PREFIX/corrupt.log +C=$(grep -c 'Rolling back' $PREFIX/corrupt.log) +test $C -eq 0 +if [ $? -ne 0 ]; then exit 1; fi +echo "DIFF: diffing original test files to dest (should be no diffs) ..." +$DIFF $ORIG $DEST 2>&1 +if [ $? -ne 0 ]; then exit 1; fi + +echo "========== TEST: testing recursive install guards =========="; +$DARWINUP install $PREFIX/depotroot.tar.gz +if [ $? -ne 255 ]; then exit 1; fi +echo "DIFF: diffing original test files to dest (should be no diffs) ..." +$DIFF $ORIG $DEST 2>&1 +if [ $? -ne 0 ]; then exit 1; fi +$DARWINUP install $DEST +if [ $? -ne 255 ]; then exit 1; fi +echo "DIFF: diffing original test files to dest (should be no diffs) ..." +$DIFF $ORIG $DEST 2>&1 +if [ $? -ne 0 ]; then exit 1; fi +darwinup $1 install / +if [ $? -ne 255 ]; then exit 1; fi +echo "DIFF: diffing original test files to dest (should be no diffs) ..." +$DIFF $ORIG $DEST 2>&1 +if [ $? -ne 0 ]; then exit 1; fi + echo "========== TEST: Try replacing File with Directory ==========" $DARWINUP install $PREFIX/rep_file_dir if [ $? -ne 255 ]; then exit 1; fi