From d0523f64e44e270acac7fa94e9d71cae5c55bd17 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 09:44:19 +0700 Subject: [PATCH 01/30] No more FW8 branches We now build for FW9 only, which mean we no longer need the entire fieldworks8-* branch system. The calculate-branches and pbuild scripts can become way simpler. --- calculate-branches.sh | 78 +------------- docker/scripts/get-version-number.sh | 6 +- pbuild.sh | 156 +++++++++++---------------- 3 files changed, 65 insertions(+), 175 deletions(-) diff --git a/calculate-branches.sh b/calculate-branches.sh index 98c47d2f..2b1de6a9 100755 --- a/calculate-branches.sh +++ b/calculate-branches.sh @@ -6,80 +6,6 @@ HEAD_BRANCH=${HEAD_BRANCH#refs/heads/} GITHUB_BRANCH=${GITHUB_HEAD_REF:-${GITHUB_REF:-$HEAD_BRANCH}} GITHUB_BRANCH=${GITHUB_BRANCH#refs/heads/} -if [ -n "${GITHUB_HEAD_REF}" ]; then - PR_BRANCH=${GITHUB_BRANCH} -fi - CURRENT_BRANCH=${GITHUB_BRANCH:-$HEAD_BRANCH} -PARENT_MAJOR_VERSION=$(git describe --long --match "v*" | cut -c1-2) - -# FW8 branches will have ancestors tagged v1.x, while FW9 branches will have ancestors tagged v2.x -if [ "x$PARENT_MAJOR_VERSION" = "xv2" ]; then - IS_FW9=true -else - IS_FW9="" -fi - -if [ "${IS_FW9}" ]; then - FW9_BUILD_BRANCH="${CURRENT_BRANCH}" - if [ "$1" ]; then - if [ "$1" = "--no-fw8" ]; then - BUILD_FW8=0 - FW8_BUILD_BRANCH="" - else - FW8_BUILD_BRANCH="$1" - fi - elif [ -n "${PR_BRANCH}" ]; then - # Find corresponding branch, if it exists, by adding "-fw8" - if git rev-parse -q --verify "${PR_BRANCH}-fw8" >/dev/null; then - FW8_BUILD_BRANCH="${PR_BRANCH}-fw8" - else - # Fall back to fieldworks8-master if no corresponding PR branch found - FW8_BUILD_BRANCH="fieldworks8-master" - fi - elif [ "${CURRENT_BRANCH}" = "master" -o "${CURRENT_BRANCH}" = "qa" -o "${CURRENT_BRANCH}" = "live" ]; then - FW8_BUILD_BRANCH="fieldworks8-${CURRENT_BRANCH}" - else - # Find corresponding branch, if it exists, by adding "-fw8" - if git rev-parse -q --verify "${CURRENT_BRANCH}-fw8" >/dev/null; then - FW8_BUILD_BRANCH="${CURRENT_BRANCH}-fw8" - else - # Fall back to fieldworks8-master if no corresponding PR branch found - FW8_BUILD_BRANCH="fieldworks8-master" - fi - fi -else - FW8_BUILD_BRANCH="${CURRENT_BRANCH}" - if [ "$1" ]; then - FW9_BUILD_BRANCH="$1" - elif [ -n "${PR_BRANCH}" ]; then - # Find corresponding branch, if it exists, by trimming "-fw8" - CANDIDATE=${PR_BRANCH%-fw8} - # If candidate is same as PR branch, this PR branch didn't match the naming scheme - if [ "x$CANDIDATE" = "x$PR_BRANCH" ]; then - FW9_BUILD_BRANCH="master" - elif git rev-parse -q --verify "${PR_BRANCH%-fw8}" >/dev/null; then - FW9_BUILD_BRANCH="${PR_BRANCH%-fw8}" - else - # Fall back to master if no corresponding PR branch found - FW9_BUILD_BRANCH="master" - fi - elif [ "${CURRENT_BRANCH}" = "fieldworks8-master" -o "${CURRENT_BRANCH}" = "fieldworks8-qa" -o "${CURRENT_BRANCH}" = "fieldworks8-live" ]; then - FW9_BUILD_BRANCH="${CURRENT_BRANCH##fieldworks8-}" - else - # Find corresponding branch, if it exists, by trimming "-fw8" - CANDIDATE=${CURRENT_BRANCH%-fw8} - # If candidate is same as current, we're on a branch that didn't match the naming scheme - if [ "x$CANDIDATE" = "x$CURRENT_BRANCH" ]; then - FW9_BUILD_BRANCH="master" - elif git rev-parse -q --verify "${CURRENT_BRANCH%-fw8}" >/dev/null; then - FW9_BUILD_BRANCH="${CURRENT_BRANCH%-fw8}" - else - # Fall back to master if no corresponding PR branch found - FW9_BUILD_BRANCH="master" - fi - fi -fi - -echo FW8Branch="${FW8_BUILD_BRANCH}" -echo FW9Branch="${FW9_BUILD_BRANCH}" +echo FW9Branch="${CURRENT_BRANCH}" +# We no longer have an FW8Branch output diff --git a/docker/scripts/get-version-number.sh b/docker/scripts/get-version-number.sh index dd15e22d..5b682fe8 100755 --- a/docker/scripts/get-version-number.sh +++ b/docker/scripts/get-version-number.sh @@ -36,15 +36,15 @@ fi echo Will calculate version from "${RESULT}" and "${MAJOR}.${MINOR}.${PATCH} with $COMMIT_COUNT commits since then, and current hash $COMMIT_HASH" case "$REV" in - refs/heads/master | refs/heads/fieldworks8-master) + refs/heads/master) PRERELEASE="~alpha.${BUILD_NUMBER}" ;; - refs/heads/qa | refs/heads/fieldworks8-qa) + refs/heads/qa) PRERELEASE="~beta.${BUILD_NUMBER}" ;; - refs/heads/live | refs/heads/fieldworks8-live) + refs/heads/live) PRERELEASE= ;; diff --git a/pbuild.sh b/pbuild.sh index 027b2d06..50921c1f 100755 --- a/pbuild.sh +++ b/pbuild.sh @@ -1,10 +1,34 @@ #!/bin/bash -which parallel >/dev/null -if [ $? -ne 0 ]; then - echo 'Please run "sudo apt-get install parallel" and try again.' - exit 1 -fi +# These are arrays; see https://www.gnu.org/software/bash/manual/html_node/Arrays.html +DBMODEL_VERSIONS=(7000072) +HISTORICAL_VERSIONS=(7000068 7000069 7000070) + +# In the future when we have more than one model version, we may want to use GNU parallel for building. +# ATTENTION: If GNU parallel is desired, uncomment the below (until the "ATTENTION: Stop uncommenting here" line): + +# DBMODEL_COUNT=${#DBMODEL_VERSIONS[@]} +# MULTIPLE_VERSIONS=0 +# if [ $DBMODEL_COUNT -gt 1 ]; then +# MULTIPLE_VERSIONS=1 +# fi + +# # Use GNU parallel only if we have multiple DBVersions to deal with +# # Specify USE_PARALLEL=0 or USE_PARALLEL=1 in environment to override this default +# USE_PARALLEL=${USE_PARALLEL:-$MULTIPLE_VERSIONS} + +# # echo We have ${DBMODEL_COUNT} versions: "${DBMODEL_VERSIONS[@]}" +# if [ $USE_PARALLEL -gt 0 ]; then +# which parallel >/dev/null +# if [ $? -ne 0 ]; then +# echo 'Please run "sudo apt-get install parallel" and try again.' +# exit 1 +# fi +# else +# echo GNU parallel will not be used +# fi + +# ATTENTION: Stop uncommenting here mkdir -p /storage/nuget if [ $? -ne 0 ]; then @@ -14,111 +38,51 @@ fi # TODO: Check for rwxrwsr-x permissions and appropriate uid/gid settings # Find appropriate branch(es) to build -CURRENT_BRANCH="$(git name-rev --name-only HEAD)" -PARENT_MAJOR_VERSION=$(git describe --long --match "v*" | cut -c1-2) -BUILD_FW8=1 - -# FW8 branches will have ancestors tagged v1.x, while FW9 branches will have ancestors tagged v2.x -if [ "x$PARENT_MAJOR_VERSION" = "xv2" ]; then - IS_FW9=true -else - IS_FW9="" -fi - -if [ "${IS_FW9}" ]; then - echo Current branch is FW9, detecting FW8 branch to use... - FW9_BUILD_BRANCH="${CURRENT_BRANCH}" - if [ "$1" ]; then - if [ "$1" = "--no-fw8" ]; then - BUILD_FW8=0 - FW8_BUILD_BRANCH="" - else - FW8_BUILD_BRANCH="$1" - fi - elif [ "${CURRENT_BRANCH}" = "master" -o "${CURRENT_BRANCH}" = "qa" -o "${CURRENT_BRANCH}" = "live" ]; then - FW8_BUILD_BRANCH="fieldworks8-${CURRENT_BRANCH}" - else - echo No FW 8 branch specified, assuming fieldworks8-master - echo To specify a different branch, run pbuild.sh '<'fw8-branch'>', e.g. '"'pbuild.sh feature/some-fw8-branch'"' - echo 'Or to skip FW 8 branch entirely, run pbuild.sh --no-fw8' - FW8_BUILD_BRANCH="fieldworks8-master" - fi -else - echo Current branch is FW8, detecting FW9 branch to use... - FW8_BUILD_BRANCH="${CURRENT_BRANCH}" - if [ "$1" ]; then - FW9_BUILD_BRANCH="$1" - elif [ "${CURRENT_BRANCH}" = "fieldworks8-master" -o "${CURRENT_BRANCH}" = "fieldworks8-qa" -o "${CURRENT_BRANCH}" = "fieldworks8-live" ]; then - FW9_BUILD_BRANCH="${CURRENT_BRANCH##fieldworks8-}" - else - echo No FW 9 branch specified, assuming master - echo To specify a different branch, run pbuild.sh '<'fw8-branch'>', e.g. '"'pbuild.sh feature/some-fw8-branch'"' - FW9_BUILD_BRANCH="master" - fi -fi - -if [ "${BUILD_FW8}" -eq 0 ]; then - echo Will build ONLY the FW9 build, from "${FW9_BUILD_BRANCH}" -else - echo Will build FW9 build from "${FW9_BUILD_BRANCH}" and FW8 builds from "${FW8_BUILD_BRANCH}" -fi +FW9_BUILD_BRANCH="$(git name-rev --name-only HEAD)" +echo Will build ONLY the FW9 build, from "${FW9_BUILD_BRANCH}" # Clean up any previous builds -# This for loop should be across all DbVersions even if BUILD_FW8 is 0 -for f in 68 69 70 72; do - # Can safely ignore "container doesn't exist" as that's not an error - docker container kill tmp-lfmerge-build-70000${f} >/dev/null 2>/dev/null || true - docker container rm tmp-lfmerge-build-70000${f} >/dev/null 2>/dev/null || true +# This for loop includes all historical DbVersions even if BUILD_FW8 is 0 +for DbVersion in ${HISTORICAL_VERSIONS[@]} ${DBMODEL_VERSIONS[@]}; do + # Can safely ignore "container doesn't exist" as that's not an error + docker container kill tmp-lfmerge-build-${DbVersion} >/dev/null 2>/dev/null || true + docker container rm tmp-lfmerge-build-${DbVersion} >/dev/null 2>/dev/null || true done CURRENT_UID=$(id -u) -# First create the base build container ONCE (not in parallel), to ensure that the slow steps (apt-get install mono5-sil) are cached +# First create the base build container ONCE (it will be reused as a base by each DbVersion build), which should help with caching docker build --build-arg "BUILDER_UID=${CURRENT_UID}" -t lfmerge-builder-base --target lfmerge-builder-base . -# Create the build images for each DbVersion in parallel -# NOTE: now that the differences are only ENV lines, parallel no longer gains any time. Should we turn this into a for loop? -if [ "${BUILD_FW8}" -eq 0 ]; then - docker build --build-arg DbVersion=7000072 --build-arg "BUILDER_UID=${CURRENT_UID}" -t lfmerge-build-7000072 . -else - time parallel --no-notice < Date: Thu, 18 Aug 2022 12:01:16 +0700 Subject: [PATCH 02/30] Slash and burn: complexity begone! --- Dockerfile | 27 +-- docker/common.sh | 154 ------------------ docker/fw8-flexbridge.tar.xz | Bin 214600 -> 0 bytes docker/make-source | 151 ----------------- docker/scripts/build-debpackages-combined.sh | 90 ---------- docker/scripts/compile-lfmerge-combined.sh | 2 +- .../scripts/download-dependencies-combined.sh | 4 +- docker/scripts/gitversion-combined.sh | 6 - docker/scripts/setup-workspace.sh | 13 +- docker/scripts/update-assemblyinfo.sh | 42 ----- 10 files changed, 6 insertions(+), 483 deletions(-) delete mode 100755 docker/common.sh delete mode 100644 docker/fw8-flexbridge.tar.xz delete mode 100755 docker/make-source delete mode 100755 docker/scripts/build-debpackages-combined.sh delete mode 100755 docker/scripts/update-assemblyinfo.sh diff --git a/Dockerfile b/Dockerfile index 7c082f62..b8f1230e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,37 +13,12 @@ RUN useradd -u "${BUILDER_UID:-DEFAULT_BUILDER_UID}" -d /home/builder -g users - echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; \ chown -R builder:users /build -# Any setup unique to the various builds goes in one of these four images -FROM lfmerge-builder-base AS lfmerge-build-7000068 -ENV DbVersion=7000068 -ENV DBVERSIONPATH=/usr/lib/lfmerge/7000068 -ENV RUN_UNIT_TESTS=0 -ENV UPDATE_ASSEMBLYINFO_BY_SCRIPT=1 -ENV NUNIT_VERSION_MAJOR=2 -# To run specific unit tests, set TEST_SPEC env var, e.g.: -# ENV TEST_SPEC=LfMerge.Core.Tests.Actions.SynchronizeActionTests.SynchronizeAction_CustomReferenceAtomicField_DoesNotThrowExceptionDuringSync - -FROM lfmerge-builder-base AS lfmerge-build-7000069 -ENV DbVersion=7000069 -ENV DBVERSIONPATH=/usr/lib/lfmerge/7000069 -ENV RUN_UNIT_TESTS=0 -ENV UPDATE_ASSEMBLYINFO_BY_SCRIPT=1 -ENV NUNIT_VERSION_MAJOR=2 -# ENV TEST_SPEC=LfMerge.Core.Tests.Actions.SynchronizeActionTests.SynchronizeAction_CustomReferenceAtomicField_DoesNotThrowExceptionDuringSync - -FROM lfmerge-builder-base AS lfmerge-build-7000070 -ENV DbVersion=7000070 -ENV DBVERSIONPATH=/usr/lib/lfmerge/7000070 -ENV RUN_UNIT_TESTS=0 -ENV UPDATE_ASSEMBLYINFO_BY_SCRIPT=1 -ENV NUNIT_VERSION_MAJOR=2 -# ENV TEST_SPEC=LfMerge.Core.Tests.Actions.SynchronizeActionTests.SynchronizeAction_CustomReferenceAtomicField_DoesNotThrowExceptionDuringSync +# Any setup unique to one specific DbVersion build goes in one of the images below FROM lfmerge-builder-base AS lfmerge-build-7000072 ENV DbVersion=7000072 ENV DBVERSIONPATH=/usr/lib/lfmerge/7000072 ENV RUN_UNIT_TESTS=0 -ENV UPDATE_ASSEMBLYINFO_BY_SCRIPT=0 ENV NUNIT_VERSION_MAJOR=3 # ENV TEST_SPEC=LfMerge.Core.Tests.Actions.SynchronizeActionTests.SynchronizeAction_CustomReferenceAtomicField_DoesNotThrowExceptionDuringSync diff --git a/docker/common.sh b/docker/common.sh deleted file mode 100755 index d350f582..00000000 --- a/docker/common.sh +++ /dev/null @@ -1,154 +0,0 @@ -#!/bin/bash - -stderr() -{ - echo -e "${RED}$PROGRAM_NAME: $1${NC}" >&2 -} - -log() -{ - echo -e "${GREEN}$PROGRAM_NAME: $1${NC}" >&2 -} - -TRACE() -{ - echo "$@" - "$@" -} - -general_init() -{ - # currently supported and future Ubuntu versions - UBUNTU_DISTROS="xenial bionic focal groovy hirsute" - # currently supported LTS versions - UBUNTU_LTS_DISTROS="xenial bionic focal" - # no longer supported Ubuntu versions that live in old-releases.ubuntu.com - UBUNTU_OLDDISTROS="" - # We're no longer building packages for: precise quantal raring saucy trusty utopic vivid wily yakkety zesty artful cosmic disco eoan - - # Debian versions - DEBIAN_DISTROS="stretch buster bullseye" - - DISTRIBUTIONS_TO_PACKAGE="${dists_arg:-bionic}" - DISTS_TO_PROCESS="${supported_distros_arg:-xenial bionic focal}" - DISTRIBUTIONS=${DISTRIBUTIONS:-$UBUNTU_DISTROS $UBUNTU_OLDDISTROS $DEBIAN_DISTROS} - ARCHES_TO_PACKAGE="${arches_arg:-i386 amd64}" - ARCHES_TO_PROCESS="amd64 i386" - PACKAGING_ROOT="${PACKAGING_ROOT:-$HOME/packages}" - SCHROOTDIR=/var/lib/schroot/chroots - - UBUNTU_MIRROR=${UBUNTU_MIRROR:-http://archive.ubuntu.com/ubuntu/} - UBUNTU_OLDMIRROR=${UBUNTU_OLDMIRROR:-http://old-releases.ubuntu.com/ubuntu/} - - if [ "$suite_name" = "main" ]; then - SUITE_NAME="" - else - SUITE_NAME="-${suite_name:-experimental}" - fi - - RESULTBASE=${WORKSPACE:-$PACKAGING_ROOT} - - # The version of mk-sbuild we use. We need a current version of that script because trying - # to build newer dists might have different requirements than the system provided version - # provides. - # 0.177 is the version included in Groovy - MKSBUILD_VERSION=0.177 - - RED='\033[0;31m' - GREEN='\033[0;32m' - NC='\033[0m' # No Color -} - -init() -{ - # Process arguments. - while (( $# )); do - case $1 in - # Process individual arguments here. Use shift and $1 to get an argument value. - # Example: -d) DEBUG=true ;; - # Example: --outfile) shift; OUTFILE=$1 ;; - # Example: *) echo "Unexpected argument: $1"; exit 1 ;; - --debkeyid) shift; debkeyid=$1 ;; - # Space-delimited list of releases. eg "precise raring" - --dists) shift; dists_arg=$1 ;; - # Space-delimited list of architectures. eg "amd64 i386" - --arches) shift; arches_arg=$1 ;; - # Comma-delimited list of non-default repositorydir=committish mapping (hash, tag, branch). eg "fwrepo/fw=2568e4f,fwrepo/fw/Localizations=linux/FieldWorks8.0.3-beta4,fwrepo/fw/DistFiles/Helps=origin/master" - --repository-committishes) shift; repository_committishes_arg=$1 ;; - # Don't upload packages at the end - --simulate-dput) dput_simulate="-s" ;; - --package-version-extension) shift; package_version_extension=$1 ;; - # Suite location: eg. experimental, updates, proposed, dictionary - --suite-name) shift; suite_name=$1 ;; - --main-package-name) shift; main_package_name_arg=$1 ;; - # Skip cleaning and updating local repository - --preserve-repository) preserve_repository_arg=true ;; - # Space-delimited list of binary packages to remove from debian/control file before creating source package - --omit-binary-packages) shift; omit_binary_packages_arg=$1 ;; - # For making release packages. Do not add a new entry to the changelog. Package versions will be as specified in the last changelog entry, without a nightly timestamp appended. - --preserve-changelog) preserve_changelog_arg=true ;; - # Omit uploading to llso. This parameter should be set when doing a release build on - # Jenkins because the package has to be downloaded, signed and manually uploaded. - --no-upload) no_upload=true ;; - # The distros we might possibly want to build - --supported-distros) shift; supported_distros_arg=$1 ;; - # The package version to use instead a version number based on the last version - # from the changelog. Any 0 will be replaced by the corresponding number from the - # changelog, e.g. passing 0.0.123.456 with a version from changelog of 3.1.2.3 - # will result in 3.1.123.456. - --package-version) shift; package_version=$1 ;; - # The subdirectory of the main repo, e.g. fw. Default is the current directory. - --main-repo-dir) shift; main_repo_dir=$1 ;; - # The name of the directory where the source code resides. Default is the name of the source package. - # This directory is relative to $repo_base_dir. - --source-code-subdir) shift; source_package_dir=$1 ;; - --no-package) no_package=true ;; - # append the argument to the package name. Only relevant for make-source. - --append-to-package) shift; append_to_package=$1;; - # use current directory to build source package instead of $repo_base_dir/${$source_package_name} - --build-in-place) build_in_place=true ;; - # use argument as delimiter that seperates the version number from the 'nightly' string - --nightly-delimiter) shift; nightlydelimeter=$1;; - --update) update=true;; - --help) helpScript; exit 0 ;; - *) stderr "Error: Unexpected argument \"$1\". Exiting." ; exit 1 ;; - esac - shift || (stderr "Error: The last argument is missing a value. Exiting."; false) || exit 2 - done - - general_init - - if [ -z "$no_package" ]; then - # set Debian/changelog environment - export DEBFULLNAME="${main_package_name_arg:-Unknown} Package Signing Key" - export DEBEMAIL='jenkins@sil.org' - - repo_base_dir=${WORKSPACE:-$PACKAGING_ROOT/$main_package_name_arg} - debian_path="debian" - source_package_name=$(dpkg-parsechangelog |grep ^Source:|cut -d' ' -f2) - fi - - if [ -n "$build_in_place" ]; then - if [ ! -d debian ]; then - if [ -n "$main_package_name_arg" ]; then - debian_path=${main_package_name_arg}/debian - else - packagedsc=$(ls *.dsc) - if [ $(wc -l $packagedsc) -gt 1 ]; then - stderr "Error: More than one .dsc file in directory and --main-package-name not specified" - exit 3 - fi - packagedsc=${packagedsc%%_*} - debian_path=${packagedsc}/debian - fi - fi - repo_base_dir=$(readlink -f $PWD) - source_package_name=$(cd $debian_path/.. && dpkg-parsechangelog |grep ^Source:|cut -d' ' -f2) - fi - - if [ -d ".hg" ]; then - VCS=hg - else - VCS=git - fi -} diff --git a/docker/fw8-flexbridge.tar.xz b/docker/fw8-flexbridge.tar.xz deleted file mode 100644 index d83613a8cb43488c54dbd522b24828f72595ec33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214600 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

_6 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

>uZZipm8p9 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

U0q@2^}G>Mq`?yxR91TGpbgqr;mE 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 z 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 Tz?L0mvBYQl0ssI200dcDAmr] [--build-in-place] - -Create a source package. - -Arguments: - --debkeyid - the GPG key to use to sign the package (instead of - trying to use Jenkins' GPG key) - --build-in-place - use the current directory as build directory instead - of \$repo_base_dir/\$source_package_name - -There are more optional parameters that can be set. See common.sh. - -NOTE: This help is incomplete. Please add the description of more options -that are useful and apply to this script. -EOF - exit 0 -} - -. ${PROGRAM_DIR}/common.sh -init "$@" - -log "Preparing" -mkdir -p "$repo_base_dir" -mkdir -p "$RESULTBASE" - -# change package name -timestamp=$(date -u +"%Y%m%dT%H%M%SZ") -latest_version_in_debian_changelog=$(dpkg-parsechangelog --show-field=Version) - -if [ "$(dpkg-parsechangelog --show-field=Distribution)" = "UNRELEASED" ]; then - unset DEBFULLNAME - export DEBEMAIL="$(dpkg-parsechangelog --show-field=Maintainer)" -fi - -if [ -n "$append_to_package" ]; then - NEWPACKAGENAME="--package=${source_package_name}${append_to_package}" - source_package_name=${source_package_name}${append_to_package} - ${PROGRAM_DIR}/change-package-name.pl $append_to_package - sed -e "s/^PACKAGENAME *=.*/&${append_to_package}/" -e "s/^APPEND *=.*/&${append_to_package}/" -i debian/rules - dch $NEWPACKAGENAME --newversion "${latest_version_in_debian_changelog}" --force-bad-version --nomultimaint "" -fi - -# Clean out old packages -rm -f "$repo_base_dir"/${source_package_name}_*.{dsc,build,changes,tar.*,log} - -if [ "$VCS" = "hg" ]; then - hash_of_current_commit=$(cd ${main_repo_dir:-.} && hg id -i 2>/dev/null |cut -c -12) -else - hash_of_current_commit=$(cd ${main_repo_dir:-.} && git rev-parse --short HEAD) -fi - -if [ -z "$package_version" ]; then - base_version=${code_version:-$latest_version_in_debian_changelog} -else - # Merge version from changelog with passed in version. Any zeros in package_version - # will be replaced by corresponding number from changelog version. - base_version_parts=(${latest_version_in_debian_changelog//./ }) - result_version="" - i=0 - for part in $(echo $package_version | tr "." "\n"); do - if [ ${#result_version} -gt 0 ]; then - result_version="${result_version}." - fi - if [ "${part:0:1}" = "0" ]; then - result_version="${result_version}${base_version_parts[$i]}${part:1}" - else - result_version="${result_version}$part" - fi - i=$[i+1] - done - base_version=$result_version -fi -nightlydelimeter=${nightlydelimeter:-"."} -nightlyversion="${base_version}${nightlydelimeter}nightly${timestamp}.${hash_of_current_commit}${package_version_extension}" - -distribution_of_last_change=$(dpkg-parsechangelog --show-field=Distribution) - -if [[ "$DISTS_TO_PROCESS" != *$distribution_of_last_change* ]]; then - distribution_of_last_change=$(echo "$DISTRIBUTIONS_TO_PACKAGE" | cut -d' ' -f1) -fi -changelog_message="Built from commit $hash_of_current_commit" -if [ -n "$most_recent_tag" ]; then - changelog_message="See git log $most_recent_tag..$hash_of_current_commit" -fi - -if [ -z "$preserve_changelog_arg" ]; then - log "Using package version: $nightlyversion-1 for $distribution_of_last_change" - native_version=$nightlyversion -elif [ -n "${package_version}" ]; then - log "Using package version: $base_version-1 for $distribution_of_last_change" - native_version=$base_version -else - log "Using package version: $latest_version_in_debian_changelog" - native_version=$latest_version_in_debian_changelog -fi - -if [ -x "build/buildupdate.mono.sh" ]; then - log "Getting artifacts from TeamCity:" - TRACE ./build/buildupdate.mono.sh -fi - -log "Building source package:" -[ -z "$build_in_place" ] && cd $repo_base_dir/${source_package_dir:-$source_package_name} -if [ -n "$debkeyid" ]; then - signing_opt="-k$debkeyid" - echo "Setting signing opts to ^$signing_opt^" -elif [ -n "$DEBSIGNKEY" ]; then - signing_opt="-k$DEBSIGNKEY" - echo "Setting signing opts to ^$signing_opt^" -fi - -if [ "$(cat debian/source/format)" == "3.0 (native)" ]; then - log "Native package. Building original source package." - # Unfortunately we have to list the files to ignore explicitly and can't use the default - # ignores because we want *.so files in the source package (needed for Mercurial) - TRACE dpkg-source -Zgzip -z6 --tar-ignore=*.a --tar-ignore=*.la --tar-ignore=*.o --tar-ignore=.*.sw? \ - --tar-ignore=*/*~ --tar-ignore=,,* --tar-ignore=.[#~]* --tar-ignore=.deps \ - --tar-ignore=.git --tar-ignore=.gitattributes --tar-ignore=.gitignore \ - --tar-ignore=.gitmodules --tar-ignore=.gitreview --tar-ignore=.hg --tar-ignore=.hgignore \ - --tar-ignore=.hgsigs --tar-ignore=.hgtags --tar-ignore=.svn --tar-ignore=debian -b . - - TRACE mv ../${source_package_name}_${latest_version_in_debian_changelog}.tar.gz ../${source_package_name}_${native_version}.orig.tar.gz - TRACE rm ../${source_package_name}_${latest_version_in_debian_changelog}.dsc - echo "3.0 (quilt)" > debian/source/format - debuild_opts="--source-option=--include-binaries --source-option=--tar-ignore" -fi - -if [ -z "$preserve_changelog_arg" -o -n "${package_version}" ]; then - # Don't change distribution here - we don't want to create a new changelog entry! - dch $NEWPACKAGENAME --newversion "${native_version}-1" --force-bad-version --nomultimaint "$changelog_message" -fi - -TRACE debuild -S -sa -Zgzip -z6 -d ${signing_opt} ${debuild_opts} - -log "Source package files exist with the following sha256sums:" -if [ -z "$build_in_place" ]; then - cd "$repo_base_dir" -else - cd .. -fi -pwd; sha256sum ${source_package_name}_*.{dsc,build,changes,tar.?z} || true diff --git a/docker/scripts/build-debpackages-combined.sh b/docker/scripts/build-debpackages-combined.sh deleted file mode 100755 index c1e066f0..00000000 --- a/docker/scripts/build-debpackages-combined.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -e - -echo -e "\033[0;34mBuilding packages for version ${DebPackageVersion} (inserted as ${Version} in .NET AssemblyInfo files)\033[0m" - -#DistributionsToPackage="xenial bionic" -DistributionsToPackage="bionic" - -DEBSIGNKEY=BB89B185D63A1DD5 - -# Needed in setup.sh from Debian packaging scripts. TODO: Investigate why this environment variable is being removed, and at what point -export USER=root - -TRACE() -{ - echo "$@" - "$@" -} - -curDbVersion=$1 - -cd ${HOME}/packages/lfmerge - -mkdir -p finalresults -rm -f finalresults/* -rm -f lfmerge-* -export MONO_PREFIX=/opt/mono5-sil -RUNMODE="PACKAGEBUILD" BUILD=Release . environ - -# for ((curDbVersion=7000068; curDbVersion<=7000070; curDbVersion++)); do - echo -e "\033[0;34mBuilding package for database version ${curDbVersion}\033[0m" - - echo -e "\033[0;34mPrepare source\033[0m" - git clean -dxf --exclude=packages/ --exclude=lib/ - git reset --hard - - if [ -n "$UPDATE_ASSEMBLYINFO_BY_SCRIPT" -a "$UPDATE_ASSEMBLYINFO_BY_SCRIPT" -ne 0 ]; then - find src -name AssemblyInfo.cs -path '*LfMerge*' -print0 | xargs -0 -n 1 ${HOME}/packages/lfmerge/docker/scripts/update-assemblyinfo.sh - fi - - cat > NuGet.Config < - - - - - -EOF - - TRACE /opt/mono5-sil/bin/msbuild /t:PrepareSource /v:detailed build/LfMerge.proj - - TRACE debian/PrepareSource $curDbVersion - - echo -e "\033[0;34mBuild source package\033[0m" - TRACE $HOME/ci-builder-scripts/bash/make-source --dists "$DistributionsToPackage" \ - --arches "amd64" --main-package-name "lfmerge" --source-code-subdir "." \ - --supported-distros "xenial bionic" --debkeyid $DEBSIGNKEY \ - --package-version "$DebPackageVersion" --preserve-changelog - - # echo -e "\033[0;34mBuild binary package\033[0m" - # TRACE $HOME/ci-builder-scripts/bash/build-package --dists "$DistributionsToPackage" \ - # --arches "amd64" --main-package-name "lfmerge" \ - # --build-in-place --supported-distros "xenial bionic" --debkeyid $DEBSIGNKEY --no-upload - - # cd - - # mv results/* finalresults/ - pwd - ls -l .. - mkdir -p finalresults/ - mv ../lfmerge-${curDbVersion}* finalresults/ -# done -ls -lR finalresults - -# Now build binaries right here -cd finalresults -echo Building packages from .dsc file: lfmerge*dsc -DSC=$(ls -1 lfmerge*dsc) -SOURCE=$(grep '^Source: ' "${DSC}" | cut -c9-) -PKGVERSION=$(grep '^Version: ' "${DSC}" | cut -c10- | sed -e 's/-[0-9]\+$//') -# Build dependency pseudo-package, install it, and immediately delete the file, in one command -sudo mk-build-deps -r -i $DSC -t 'apt-get -y -o Debug::pkgProblemResolver=yes --no-install-recommends' -# Extract source -dpkg-source -x $DSC -ls -l -echo Should be a directory named "${SOURCE}-${PKGVERSION}" -cd "${SOURCE}-${PKGVERSION}" -# Build package, preserving env vars used in MsBuild packaging -debuild -rfakeroot --preserve-envvar Version --preserve-envvar AssemblyVersion --preserve-envvar FileVersion --preserve-envvar InformationalVersion -# Built packages are placed in parent directory, so now we'll delete the unpacked directory so `docker container cp` doesn't collect it -cd .. -rm -rf "${SOURCE}-${PKGVERSION}" diff --git a/docker/scripts/compile-lfmerge-combined.sh b/docker/scripts/compile-lfmerge-combined.sh index 23cbce95..bfe0fe86 100755 --- a/docker/scripts/compile-lfmerge-combined.sh +++ b/docker/scripts/compile-lfmerge-combined.sh @@ -10,7 +10,7 @@ echo "Using $(which dotnet)" export DbVersion="${1-7000072}" echo "Building for ${DbVersion}" -dotnet build /t:CompileOnly /v:quiet /property:Configuration=Release /property:DatabaseVersion=${DbVersion} build/LfMerge.proj +dotnet msbuild /t:CompileOnly /v:quiet /property:Configuration=Release /property:DatabaseVersion=${DbVersion} build/LfMerge.proj # ln -sf ../Mercurial output/ # xbuild /t:TestOnly /v:detailed /property:Configuration=Release /property:DatabaseVersion=${DbVersion} build/LfMerge.proj diff --git a/docker/scripts/download-dependencies-combined.sh b/docker/scripts/download-dependencies-combined.sh index 3c9fd147..7bfff9b8 100755 --- a/docker/scripts/download-dependencies-combined.sh +++ b/docker/scripts/download-dependencies-combined.sh @@ -9,7 +9,9 @@ export MONO_PREFIX=/opt/mono5-sil pwd if [ "x$1" = "x7000072" ]; then -msbuild /t:RestorePackages /p:KeepJobsFile=false build/LfMerge.proj +# msbuild /t:RestorePackages /p:KeepJobsFile=false build/LfMerge.proj +echo "Skipping dotnet restore since that happens automatically in dotnet build step" +# dotnet restore else msbuild /t:DownloadDependencies /p:KeepJobsFile=false build/LfMerge.proj fi diff --git a/docker/scripts/gitversion-combined.sh b/docker/scripts/gitversion-combined.sh index 7a60259a..a216c702 100755 --- a/docker/scripts/gitversion-combined.sh +++ b/docker/scripts/gitversion-combined.sh @@ -22,10 +22,4 @@ RUNMODE="PACKAGEBUILD" BUILD=Release . environ # msbuild build/LfMerge.proj mkdir -p output/Release -if [ -n "$UPDATE_ASSEMBLYINFO_BY_SCRIPT" -a "$UPDATE_ASSEMBLYINFO_BY_SCRIPT" -ne 0 ]; then - UPDATE_SCRIPT="${SCRIPT_DIR}/update-assemblyinfo.sh" - echo "Will run ${UPDATE_SCRIPT} to update AssemblyInfo.cs files" - [ -x "${UPDATE_SCRIPT}" ] && find src -name AssemblyInfo.cs -path '*LfMerge*' -print0 | xargs -0 -n 1 "${UPDATE_SCRIPT}" -fi - echo "Building packages for version ${DebPackageVersion}" diff --git a/docker/scripts/setup-workspace.sh b/docker/scripts/setup-workspace.sh index 9edc84af..1ed2ffc1 100755 --- a/docker/scripts/setup-workspace.sh +++ b/docker/scripts/setup-workspace.sh @@ -3,20 +3,13 @@ set -e DEST="${1:-${HOME}/packages/lfmerge}" - -export MONO_PREFIX=/opt/mono5-sil - -mkdir -p "${HOME}/.gnupg" "${HOME}/ci-builder-scripts/bash" "${DEST}" +mkdir -p "${DEST}" REPO_ROOT="$(git rev-parse --show-toplevel)" # cp -a "${REPO_ROOT}" "${DEST}" creates ${DEST}/repo and then everything is under there. That's not actually what we want. So... sudo cp -a "${REPO_ROOT}"/* "${REPO_ROOT}"/.[a-zA-Z0-9]* "${DEST}" sudo chown -R builder:users "${DEST}" -# The make-source shell script (and its common.sh helper) expects to live under ${HOME}/ci-builder-scripts/bash, so make sure that's the case -mkdir -p "${HOME}/ci-builder-scripts/bash" -cp "${DEST}/docker/common.sh" "${HOME}/ci-builder-scripts/bash/" -cp "${DEST}/docker/make-source" "${HOME}/ci-builder-scripts/bash/" cd "${DEST}" if [ "${BRANCH_TO_BUILD}" ]; then @@ -25,7 +18,3 @@ fi git clean -dxf --exclude=packages/ --exclude=build/packages/ git reset --hard - -# FLExBridge dependencies from FW 8 builds have vanished from TeamCity, so we stored them in the Docker image under ${REPO_ROOT}/docker -mkdir -p lib -(cd lib && xz -dc "${REPO_ROOT}/docker/fw8-flexbridge.tar.xz" | tar xf -) diff --git a/docker/scripts/update-assemblyinfo.sh b/docker/scripts/update-assemblyinfo.sh deleted file mode 100755 index 832b53c9..00000000 --- a/docker/scripts/update-assemblyinfo.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -if [ $# -le 0 ]; then - echo "Error: no filename given. Please pass a filename on the command line." - exit 1 -fi -if [ $# -gt 1 ]; then - echo "Warning: multiple filenames passed. Only $1 will be processed." >&2 -fi - -# Rules for auto-generated AssemblyInfo in .Net Core 3.1 or later, which we will replicate: -# AssemblyVersion and FileVersion default to the value of $(Version) without the suffix. For example, if $(Version) is 1.2.3-beta.4, then the value would be 1.2.3. -# InformationalVersion defaults to the value of $(Version). -# Source: https://docs.microsoft.com/en-us/dotnet/core/project-sdk/msbuild-props#generateassemblyinfo - -Version=${Version:-0.0.1} - -InformationalVersion=${InformationalVersion:-$Version} -AssemblyVersion=${AssemblyVersion:-$(echo "$Version" | sed -E 's/^([^-]*)+.*/\1/')} -FileVersion=${FileVersion:-$(echo "$Version" | sed -E 's/^([^-]*)+.*/\1/')} - -# Assembly attribute lines look like this: -# [assembly: AssemblyVersion("1.2.3.4")] - -tmpfname="$(mktemp)" -fname="$1" - -echo "Updating ${fname} with AssemblyVersion ${AssemblyVersion} and InformationalVersion ${InformationalVersion}" - -# First remove any existing lines -cat "$fname" \ -| sed '/^\[assembly: AssemblyVersion("[^"]*")\]$/d' \ -| sed '/^\[assembly: AssemblyFileVersion("[^"]*")\]$/d' \ -| sed '/^\[assembly: AssemblyInformationalVersion("[^"]*")\]$/d' \ -> "$tmpfname" - -# Then append new lines at the end -echo "[assembly: AssemblyVersion(\"${AssemblyVersion}\")]" >> "$tmpfname" -echo "[assembly: AssemblyFileVersion(\"${FileVersion}\")]" >> "$tmpfname" -echo "[assembly: AssemblyInformationalVersion(\"${InformationalVersion}\")]" >> "$tmpfname" - -mv "${tmpfname}" "${fname}" From 692864608fe4e3d6f9528e0ae35a6730b682e806 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 17:28:34 +0700 Subject: [PATCH 03/30] Rely entirely on dotnet restore for packages This lets us get rid of the NuGet.targets file and its complexity. --- Dockerfile | 4 ++-- build/LfMerge.proj | 11 ++--------- docker/scripts/compile-lfmerge-combined.sh | 2 +- docker/scripts/create-installation-tarball.sh | 1 - docker/scripts/download-dependencies-combined.sh | 4 +--- docker/scripts/test-lfmerge-combined.sh | 2 +- environ | 2 +- pbuild.sh | 2 +- src/FixFwData/FixFwData.csproj | 6 ++++++ src/LfMerge.Core/LfMerge.Core.csproj | 7 +++++++ 10 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Dockerfile b/Dockerfile index b8f1230e..834f6f7c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ RUN test -n "$BUILDER_UID" ENV BUILDER_UID="$BUILDER_UID" # # Build as a non-root user -RUN useradd -u "${BUILDER_UID:-DEFAULT_BUILDER_UID}" -d /home/builder -g users -G www-data,fieldworks,systemd-journal -m -s /bin/bash builder ; \ +RUN useradd -u "${BUILDER_UID:-DEFAULT_BUILDER_UID}" -d /home/builder -g users -G www-data,fieldworks -m -s /bin/bash builder ; \ echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers; \ chown -R builder:users /build @@ -28,7 +28,7 @@ USER builder # Git repo should be mounted under ${HOME}/packages/lfmerge when run # E.g., `docker run --mount type=bind,source="$(pwd)",target=/home/builder/packages/lfmerge` -RUN mkdir -p /home/builder/repo /home/builder/packages/lfmerge +RUN mkdir -p /home/builder/repo /home/builder/packages/lfmerge /home/builder/.nuget/packages CMD /home/builder/repo/docker/scripts/build-and-test.sh ${DbVersion} # CMD doesn't actually run the script, it just gives `docker run` a default. # So it's okay for the Git repo to not be mounted yet. diff --git a/build/LfMerge.proj b/build/LfMerge.proj index 2a10c516..02dc1b8e 100644 --- a/build/LfMerge.proj +++ b/build/LfMerge.proj @@ -3,7 +3,6 @@ $(MSBuildProjectDirectory)/.. LfMerge.sln $(RootDir)/$(Solution) - $(RootDir)/packages LfMerge lfmerge Release @@ -22,7 +21,6 @@ AssemblyFile="$(RootDir)/packages/SIL.BuildTasks/tools/SIL.BuildTasks.dll" Condition="Exists('$(RootDir)/packages/SIL.BuildTasks/tools/SIL.BuildTasks.dll')" /> - @@ -61,19 +59,14 @@ WorkingDirectory="$(RootDir)" /> - - - - - - + - + /dev/n install -m 755 output/${BUILD}/${FRAMEWORK}/LfMergeQueueManager ${DBDESTDIR}/${LIB} 2>/dev/null || install -m 755 output/${BUILD}/LfMergeQueueManager ${DBDESTDIR}/${LIB} install -m 755 output/${BUILD}/${FRAMEWORK}/chorusmerge ${DBDESTDIR}/${LIB} 2>/dev/null || install -m 755 output/${BUILD}/chorusmerge ${DBDESTDIR}/${LIB} install -m 755 output/${BUILD}/${FRAMEWORK}/FixFwData ${DBDESTDIR}/${LIB} 2>/dev/null || install -m 755 output/${BUILD}/FixFwData ${DBDESTDIR}/${LIB} -(cd ${DBDESTDIR}/${LIB}; ln FixFwData FixFwData.exe) install -d ${DBDESTDIR}/${LIB}/Mercurial install -d ${DBDESTDIR}/${LIB}/Mercurial/hgext install -d ${DBDESTDIR}/${LIB}/Mercurial/hgext/convert diff --git a/docker/scripts/download-dependencies-combined.sh b/docker/scripts/download-dependencies-combined.sh index 7bfff9b8..b63c693d 100755 --- a/docker/scripts/download-dependencies-combined.sh +++ b/docker/scripts/download-dependencies-combined.sh @@ -9,9 +9,7 @@ export MONO_PREFIX=/opt/mono5-sil pwd if [ "x$1" = "x7000072" ]; then -# msbuild /t:RestorePackages /p:KeepJobsFile=false build/LfMerge.proj -echo "Skipping dotnet restore since that happens automatically in dotnet build step" -# dotnet restore +dotnet restore -v:m else msbuild /t:DownloadDependencies /p:KeepJobsFile=false build/LfMerge.proj fi diff --git a/docker/scripts/test-lfmerge-combined.sh b/docker/scripts/test-lfmerge-combined.sh index 2b2d1dc0..760a3a91 100755 --- a/docker/scripts/test-lfmerge-combined.sh +++ b/docker/scripts/test-lfmerge-combined.sh @@ -22,5 +22,5 @@ if [ -n "$TEST_SPEC" ]; then mono packages/NUnit.ConsoleRunner/tools/nunit3-console.exe output/Release/LfMerge*.Tests.dll --test "$TEST_SPEC" fi else - msbuild /t:TestOnly /v:detailed /property:Configuration=Release build/LfMerge.proj + dotnet test --no-restore -c Release fi diff --git a/environ b/environ index 5e186b97..46ab43c6 100644 --- a/environ +++ b/environ @@ -28,7 +28,7 @@ then MONO_PATH="${BASE}:${MONO_PATH}" else # Add the build output to paths - PATH="${BASE}/output/${BUILD}:${PATH}" + PATH="${BASE}/output/${BUILD}:${BASE}/output/Mercurial:${PATH}" LD_LIBRARY_PATH="${BASE}/output/${BUILD}:${LD_LIBRARY_PATH}" MONO_PATH="${BASE}/output/${BUILD}:${MONO_PATH}" [ -f "${BASE}/output/${BUILD}/components.map" ] && COMPONENTS_MAP_PATH="${BASE}/output/${BUILD}" diff --git a/pbuild.sh b/pbuild.sh index 50921c1f..b159d8b6 100755 --- a/pbuild.sh +++ b/pbuild.sh @@ -65,7 +65,7 @@ done for DbVersion in ${DBMODEL_VERSIONS[@]}; do docker run -it \ --mount type=bind,source="$(pwd)",target=/home/builder/repo \ - --mount type=bind,src=/storage/nuget,dst=/storage/nuget \ + --mount type=bind,src=/storage/nuget,dst=/home/builder/.nuget/packages \ --mount type=tmpfs,dst=/tmp \ --env "BRANCH_TO_BUILD=${FW9_BUILD_BRANCH}" \ --env "BUILD_NUMBER=999" \ diff --git a/src/FixFwData/FixFwData.csproj b/src/FixFwData/FixFwData.csproj index 062f5823..d0c2f340 100644 --- a/src/FixFwData/FixFwData.csproj +++ b/src/FixFwData/FixFwData.csproj @@ -39,6 +39,12 @@ See full changelog at https://github.com/sillsdev/LfMerge/blob/master/CHANGELOG. + + + + + diff --git a/src/LfMerge.Core/LfMerge.Core.csproj b/src/LfMerge.Core/LfMerge.Core.csproj index ef61cfb9..e884932a 100644 --- a/src/LfMerge.Core/LfMerge.Core.csproj +++ b/src/LfMerge.Core/LfMerge.Core.csproj @@ -39,6 +39,9 @@ See full changelog at https://github.com/sillsdev/LfMerge/blob/master/CHANGELOG. + + contentfiles;analyzers + @@ -48,6 +51,10 @@ See full changelog at https://github.com/sillsdev/LfMerge/blob/master/CHANGELOG. + + + + chorusmerge From f8dd9c3475b537685208cf50a25a25bd87199ea8 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 17:31:50 +0700 Subject: [PATCH 04/30] Get unit tests running A lot of failures, but now `dotnet test` is able to find and run the tests. We'll work on the test failures later. --- Dockerfile | 5 +++++ build/NuGet.targets | 11 ----------- src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj | 3 ++- src/LfMerge.Tests/LfMerge.Tests.csproj | 3 ++- 4 files changed, 9 insertions(+), 13 deletions(-) delete mode 100644 build/NuGet.targets diff --git a/Dockerfile b/Dockerfile index 834f6f7c..ccb1eeb2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,6 +24,11 @@ ENV NUNIT_VERSION_MAJOR=3 FROM lfmerge-build-${DbVersion} AS lfmerge-build +# So unit tests can run +RUN mkdir -p /var/lib/languageforge/lexicon/sendreceive/ \ + && cd /var/lib/languageforge/lexicon/sendreceive/ && mkdir Templates state editqueue syncqueue webwork && cd - \ + && chown -R builder:users /var/lib/languageforge/lexicon/sendreceive + USER builder # Git repo should be mounted under ${HOME}/packages/lfmerge when run diff --git a/build/NuGet.targets b/build/NuGet.targets deleted file mode 100644 index ddec48dd..00000000 --- a/build/NuGet.targets +++ /dev/null @@ -1,11 +0,0 @@ - - - - $(MSBuildProjectDirectory)/.. - $(RootDir)/packages - - - - - diff --git a/src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj b/src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj index 4bbca072..087d09d1 100644 --- a/src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj +++ b/src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj @@ -33,7 +33,8 @@ See full changelog at https://github.com/sillsdev/LfMerge/blob/master/CHANGELOG. - + + diff --git a/src/LfMerge.Tests/LfMerge.Tests.csproj b/src/LfMerge.Tests/LfMerge.Tests.csproj index 81c6a4a0..565106f8 100644 --- a/src/LfMerge.Tests/LfMerge.Tests.csproj +++ b/src/LfMerge.Tests/LfMerge.Tests.csproj @@ -33,8 +33,9 @@ See full changelog at https://github.com/sillsdev/LfMerge/blob/master/CHANGELOG. - + + From 07e3713356dedafc7731d3cd1ba86da29e7448e7 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 17:32:22 +0700 Subject: [PATCH 05/30] Slash and burn: mono5-sil et al, begone! --- Dockerfile.builder-base | 9 +-------- Dockerfile.finalresult | 4 +--- Dockerfile.runtime-base | 9 +-------- 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/Dockerfile.builder-base b/Dockerfile.builder-base index ce4b5df2..7a32f2e4 100644 --- a/Dockerfile.builder-base +++ b/Dockerfile.builder-base @@ -5,16 +5,9 @@ WORKDIR /build/lfmerge ENV DEBIAN_FRONTEND=noninteractive ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 -RUN apt-get update && apt-get install -y gnupg -COPY sil-packages-key.gpg . -COPY sil-packages-testing-key.gpg . -RUN apt-key add sil-packages-key.gpg -RUN apt-key add sil-packages-testing-key.gpg -RUN echo 'deb http://linux.lsdev.sil.org/ubuntu bionic main' > /etc/apt/sources.list.d/llso-experimental.list -RUN echo 'deb http://linux.lsdev.sil.org/ubuntu bionic-experimental main' >> /etc/apt/sources.list.d/llso-experimental.list # Dependencies from Debian "control" file -RUN apt-get update && apt-get install -y sudo debhelper devscripts cli-common-dev iputils-ping cpp python-dev pkg-config mono5-sil mono5-sil-msbuild libicu-dev lfmerge-fdo && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y curl sudo iputils-ping cpp python-is-python2 python2-dev pkg-config libicu-dev && rm -rf /var/lib/apt/lists/* # Ensure fieldworks group exists in case lfmerge-fdo package didn't install it, and that www-data is part of that group # Also ensure that www-data has a .local dir in its home directory (/var/www) since some of lfmerge's dependencies assume that $HOME/.local exists diff --git a/Dockerfile.finalresult b/Dockerfile.finalresult index 8d595c8a..0bf9a505 100644 --- a/Dockerfile.finalresult +++ b/Dockerfile.finalresult @@ -12,9 +12,7 @@ FROM ghcr.io/sillsdev/lfmerge-base:runtime # iputils-ping - Chorus (part of LFMerge) requires the "ping" command to be available on the command line # less - so we can read syslog during manual debugging of issues # vim-tiny - so we can edit state files (to change HOLD to IDLE) during manual debugging of issues -RUN curl -L http://linux.lsdev.sil.org/downloads/sil-testing.gpg | apt-key add - \ -&& echo "deb http://linux.lsdev.sil.org/ubuntu bionic main" > /etc/apt/sources.list.d/linux-lsdev-sil-org.list \ -&& apt-get update \ +RUN apt-get update \ && apt-get install --yes --no-install-recommends tini python rsyslog logrotate iputils-ping inotify-tools less vim-tiny \ && rm -rf /var/lib/apt/lists/* \ && sed -i '/load="imklog"/s/^/#/' /etc/rsyslog.conf diff --git a/Dockerfile.runtime-base b/Dockerfile.runtime-base index 57d06acf..3d1406a7 100644 --- a/Dockerfile.runtime-base +++ b/Dockerfile.runtime-base @@ -5,16 +5,9 @@ WORKDIR /build/lfmerge ENV DEBIAN_FRONTEND=noninteractive ENV DOTNET_CLI_TELEMETRY_OPTOUT=1 -RUN apt-get update && apt-get install -y gnupg -COPY sil-packages-key.gpg . -COPY sil-packages-testing-key.gpg . -RUN apt-key add sil-packages-key.gpg -RUN apt-key add sil-packages-testing-key.gpg -RUN echo 'deb http://linux.lsdev.sil.org/ubuntu bionic main' > /etc/apt/sources.list.d/llso-experimental.list -RUN echo 'deb http://linux.lsdev.sil.org/ubuntu bionic-experimental main' >> /etc/apt/sources.list.d/llso-experimental.list # Dependencies from Debian "control" file -RUN apt-get update && apt-get install -y sudo debhelper devscripts cli-common-dev iputils-ping cpp python-dev pkg-config mono5-sil mono5-sil-msbuild libicu-dev lfmerge-fdo && rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y curl sudo iputils-ping cpp python-is-python2 python2-dev pkg-config libicu-dev && rm -rf /var/lib/apt/lists/* # Ensure fieldworks group exists in case lfmerge-fdo package didn't install it, and that www-data is part of that group # Also ensure that www-data has a .local dir in its home directory (/var/www) since some of lfmerge's dependencies assume that $HOME/.local exists From 06a1a6835ff00ff859478ee3dc5d4767a75fa430 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 17:33:20 +0700 Subject: [PATCH 06/30] Have pbuild.sh create base images directly Now that mono-sil5 and its complexity are gone, we can have pbuild.sh create the base images directly since that doesn't take very long. This will allow us to iterate more quickly on base image changes. --- pbuild.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pbuild.sh b/pbuild.sh index b159d8b6..064f5aa3 100755 --- a/pbuild.sh +++ b/pbuild.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + # These are arrays; see https://www.gnu.org/software/bash/manual/html_node/Arrays.html DBMODEL_VERSIONS=(7000072) HISTORICAL_VERSIONS=(7000068 7000069 7000070) @@ -52,6 +54,8 @@ done CURRENT_UID=$(id -u) # First create the base build container ONCE (it will be reused as a base by each DbVersion build), which should help with caching +docker build -t ghcr.io/sillsdev/lfmerge-base:sdk -f Dockerfile.builder-base . +docker build -t ghcr.io/sillsdev/lfmerge-base:runtime -f Dockerfile.runtime-base . docker build --build-arg "BUILDER_UID=${CURRENT_UID}" -t lfmerge-builder-base --target lfmerge-builder-base . # Create the build images for each DbVersion From dd21a62ef3f0bfca1e553863f266a522ab3f6da6 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 16:45:48 +0700 Subject: [PATCH 07/30] Slash and burn: LfMerge.proj, begone! Hurrah! We no longer need to use LfMerge.proj at all! We can now rely entirely on the standard `dotnet build` and `dotnet test` build process. --- build/LfMerge.proj | 104 ---------------------------- build/install-deps | 12 ---- build/package.json | 12 ---- docker/compile-lfmerge.sh | 10 --- docker/sil-packages-key.gpg | 28 -------- docker/sil-packages-testing-key.gpg | 30 -------- 6 files changed, 196 deletions(-) delete mode 100644 build/LfMerge.proj delete mode 100755 build/install-deps delete mode 100644 build/package.json delete mode 100755 docker/compile-lfmerge.sh delete mode 100644 docker/sil-packages-key.gpg delete mode 100644 docker/sil-packages-testing-key.gpg diff --git a/build/LfMerge.proj b/build/LfMerge.proj deleted file mode 100644 index 02dc1b8e..00000000 --- a/build/LfMerge.proj +++ /dev/null @@ -1,104 +0,0 @@ - - - $(MSBuildProjectDirectory)/.. - LfMerge.sln - $(RootDir)/$(Solution) - LfMerge - lfmerge - Release - true - false - 2.6.4 - true - false - $(RootDir)/output/$(Configuration)/TestResults.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/install-deps b/build/install-deps deleted file mode 100755 index 4d6c49b2..00000000 --- a/build/install-deps +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -e -# Copyright (c) 2016 SIL International -# This software is licensed under the MIT License (http://opensource.org/licenses/MIT) -# -# Install required dependencies (as defined in the package control file) - -sudo apt-get update -sudo DEBIAN_FRONTEND=noninteractive apt-get install -y equivs devscripts -sudo DEBIAN_FRONTEND=noninteractive mk-build-deps --install --remove \ - --tool "apt-get --no-install-recommends -y" $(dirname "$0")/../debian/control -sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \ - $(apt-cache depends lfmerge-build-deps | grep Depends | cut -f 4 -d" ") diff --git a/build/package.json b/build/package.json deleted file mode 100644 index 5337536f..00000000 --- a/build/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "deploy-live.gulpfile.js", - "description": "Gulpfile to download latest live .deb and deploy it on live server", - "devDependencies": { - "gulp-download": "0.0.1", - "gulp-fn": "0.0.0", - "gulp-json-transform": "^0.3.2", - "gulp-rename": "^1.2.2", - "gulp-savefile": "^0.1.1", - "gulp-shell": "^0.5.2" - } -} diff --git a/docker/compile-lfmerge.sh b/docker/compile-lfmerge.sh deleted file mode 100755 index 792e3ab7..00000000 --- a/docker/compile-lfmerge.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -e -echo "Compiling LfMerge and running unit tests" -BUILD=Release . environ - -echo "Using $(which dotnet)" -dotnet build /t:CompileOnly /v:detailed /property:Configuration=Release build/LfMerge.proj -# TODO: Determine if this symlink is necessary -ln -sf ../Mercurial output/ -# TODO: Test all DLLs -# dotnet test -f net462 LfMerge.Core.Tests.dll diff --git a/docker/sil-packages-key.gpg b/docker/sil-packages-key.gpg deleted file mode 100644 index 316085a7..00000000 --- a/docker/sil-packages-key.gpg +++ /dev/null @@ -1,28 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQINBFhFlhUBEADQJ7pmIGkKNbju529klmZn7BmngvLFlRlPRAgBF8nx29pj56+s -+PFIvN/fionvisnnTqHmPoDCpfxSTyso4VHkV1fvYpB1vthdl4xRlZrdq+1zaghz -yeHj5T8hnWwwdP/na7MCEFv1qnPVWOPXrLH2WFjrmDDvZrzcY6XK/5MYx/E40mbL -4d5yp/4JRp6BX2eRIJaAw33EKZ3799xgSQzbAwtf4LZzZoBxFUW+fzFVrGShlS5O -eODHD4mtWKrd1rZeri/6FV7xGR7CU2F3rnDpByP5MtWp0no/RQWX2PO9PwI5WZAz -WopDGt+/IBaJUW0zc4F+8bRQjHKu3dnyVf5mZ1KhxMGilKqA0gyabSPSLBw4WRDb -+GvenzZoCNmVBf69vJkiyzB+4ADmZsx+v7coOa7kvlinxW04tlDTfzH2hrp0xNcP -Whb0VFkYSxmavkgOegMvOPFksFY6QRu0VQt1u8Zhpo1LMe/Sk+ORdeby1EzhyINM -jzM6u32HxjGdnJqWTUTLi1IrQgLnlM//QTtl5xUVZMvcrQgBCFfVfp8D+DPR7n2u -q/ec2xDg7fBPSdvhBLKgXKJR/yS9L7BFP8jEXiHTUCiHickNN27vB2TvaLDkpBav -iW8xjKBb13RbwFxEFvNJPjMH2czgyqfnO7DGvCNl7aMgrH9ZuO41WJyjRQARAQAB -tCdTSUwgUGFja2FnZXMgPGFyY2hpdmVAcGFja2FnZXMuc2lsLm9yZz6JAjcEEwEI -ACEFAlhFlhUCGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AACgkQ7NMEvWVSO7nN -XA//TIUre4VhBbltSfPmtNGm+dMgEwF4wW9KBqY8qrcUdob3qCd80Tbz3ZwDG6J0 -oNh+UP5Bx3d/jg4GjYynTw+v5Y4B0SK1Vmf6yXZc+YVN3KJKZKM9GFbolQeK6Kov -4BgcdElw4NeiveUKeBLzmxg+b1MZwpcnVIThDY4n4jyhRPjS3LEgbZzUUbTB1d+f -Goggh544scjBUAnuFoMeYKldyN3mHOZAtKTgMfeajwqB9U2CU5AcL9cmOzTH6Iuv -ZjJdKyXSJf5B5tFAoXhz4zXedpYxvDUvE/evVYAr2Qvj1+/2v7BroEEqmBGDeUlp -1QW/pXBN8JmKXgamEh8sY7EVxRx3+HPlRN0Pc4iPqc8SjpuZwA7URj0ooHmNYm/+ -Cdno71/5vs833WgLGspBVFdAOREPabIBzTFbT2HW+hBvArcVlZXpLsArbd9wwbY1 -n/6MP1kPtAnVtA8+oDo+BpRTZINaYOsy0X+8TQ+j/RVBaIFJT6kSbjxxAZHTV7sS -1vHzSVKW+Pz9kCb+trFnlll0zuLvztzL/u569Duv3Q7SrxXjr+9oOMiZsqb56hBB -ddvDhvoOhZg/B74nRz5pdXl3GK0oY5b5BI47hKX2sCtI/s+V8jM/DuyHt1vH+oaL -OxRe+GqHgM3HVqG/mlRWfCHqvhdDERjTm/D47Agi7xiEL6w= -=DSkQ ------END PGP PUBLIC KEY BLOCK----- diff --git a/docker/sil-packages-testing-key.gpg b/docker/sil-packages-testing-key.gpg deleted file mode 100644 index cf38fe83..00000000 --- a/docker/sil-packages-testing-key.gpg +++ /dev/null @@ -1,30 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBFILpkEBCACtt6o/TNmy4jb0buz5/ex9TW2BgP3yCRwgt5BbSwWJ9OWqn+Kr -YTyCZuJFAjjeNwnkOs4rR7k83wkIUMe+FHa569i15QXiqPUbBx8xqQ44KmzIX3gl -J2sKpPU3tRIJyAGQebQQFgTYTT7ZjMFDNniWkfhrkXK2Uyj786AFcCIcM4ahVBfJ -PrjQzrbl0zgY6tG40PDfy+zjUzICNZSoJtzTCEvMy4g+XCy8QMobtNaH63Q+uEdF -cpA/izvZedZGNcF5Mo+pENuFO9Rlq5/A1VTlor0oyG247oY65k/YLS7IktrZsS5L -SeOdSKSy7ZgADbZUYEasAyqAyh3zWmgcwuvbABEBAAG0PFNJTCBQYWNrYWdlcyAo -VGVzdGluZyBSZXBvc2l0b3J5KSA8YXJjaGl2ZUBwYWNrYWdlcy5zaWwub3JnPokB -OAQTAQIAIgUCUgumQQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQoiYD -oOZvjb0wRwf/YX10v55uzp0P07ntLrBd02k1BdmKNZcrrbN7Bw+YkAuOOLkk4c9a -iPP967F1bMxWX8DZGMZQnJkM+5wYyEUmR59823R1cy02sxvhQZEy+rEloomJomw2 -7dPON0bG4ZkmbZpMvgREWgQf2JGpCiH0UkIQyHjnYIJ3Jb5U5sZAttDKNW6pF1U4 -pQu1TFq0DFfaWbf+XMYUDhYPcsUBlFaTiQlLZW7tJgGJt3HAby/2lyRTcvXR6p4E -7gnm9N4wW13AFx7T2xzXdtVS5JmXY51qSUSgNmgRQg9Nqxs1r8KJaEYiM7wf0/We -PlqvkAoU/uIUGoTR0S2kpmvfMC3hy954d7kBDQRSC6ZBAQgAujEqmBB2L74H4ZzS -EQNDZbu4ZgrV7ax/8SmjKP0EYzfcw2/egjTydE80DzAkLaGqHoHCvvYK3OGyBVZm -tDFjepAy5+6axPReRiwQn2GPqEvy++zx0NWHstm2qMp6xxhXYctmPCatD7U/j4J4 -3fuhd0N0sVJhve6XuPLe1q9HWOOn+xlxHmUgW3nnICXAKuOW5RQqyLID4Wczg/g/ -TXzrKsBKSCLeuPa59zORbHszGbK3a301o0zw+5GTmAtbDdIPJEdRlcs3tan8fHIa -y19T16HCF70L5N8lQPfz7zRvMK6R25Dnax4JfoHhpyMXpS1cuyeq46gz2mWCrkCq -VbpZVQARAQABiQEfBBgBAgAJBQJSC6ZBAhsMAAoJEKImA6Dmb429xwIH/jtEVvuP -yVTFZwN/qKCeSA81PEXvZLtHH9mIxD2t5xHgkTHmxeFERxStOHljFiLhL8bHy1Io -BVaqEQd3QrEoMP2Ebgwdq4Lq2ZQwy3xjuX3r1EdHci5Vu8NYuSAXUqKRiO0yE9St -Yc1Pnrs9npjuUI+jFQa5LRf9l5gQAM6OcHzvVe/tNyht0GWAj1iTaFW8eKMub6BX -GRaXAYeR8nKuFd5jIX7yvJzo3gIYGb924G285BjcHCiqGmuAxGinw0/OolvTbaUd -xaz8230EF5P6UD1yE/pbaXTwOFBqJoF9qKvC1Y159s9BOZsqwFQHsQLw/7RZC0J7 -Id1T1+d1fQW7HUc= -=/rsE ------END PGP PUBLIC KEY BLOCK----- From 0f8707aff8ad8f748263ef53038b18dd48fafec9 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 16:46:45 +0700 Subject: [PATCH 08/30] No longer need to keep NuGet packages in build dir --- docker/scripts/setup-workspace.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/scripts/setup-workspace.sh b/docker/scripts/setup-workspace.sh index 1ed2ffc1..6f49d1a1 100755 --- a/docker/scripts/setup-workspace.sh +++ b/docker/scripts/setup-workspace.sh @@ -16,5 +16,5 @@ if [ "${BRANCH_TO_BUILD}" ]; then git checkout "${BRANCH_TO_BUILD}" fi -git clean -dxf --exclude=packages/ --exclude=build/packages/ +git clean -dxf git reset --hard From 8dc75e1e8617d2154cb4604a04c103cb99c03816 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 17:16:55 +0700 Subject: [PATCH 09/30] Slash and burn: build complexity begone! We can move most things into a single build-and-test.sh script. --- docker/scripts/build-and-test.sh | 27 ++++++++++--------- docker/scripts/compile-lfmerge-combined.sh | 16 ----------- .../scripts/download-dependencies-combined.sh | 16 ----------- docker/scripts/gitversion-combined.sh | 25 ----------------- docker/scripts/test-lfmerge-combined.sh | 26 ------------------ 5 files changed, 15 insertions(+), 95 deletions(-) delete mode 100755 docker/scripts/compile-lfmerge-combined.sh delete mode 100755 docker/scripts/download-dependencies-combined.sh delete mode 100755 docker/scripts/gitversion-combined.sh delete mode 100755 docker/scripts/test-lfmerge-combined.sh diff --git a/docker/scripts/build-and-test.sh b/docker/scripts/build-and-test.sh index f3f89528..7c8f6a49 100755 --- a/docker/scripts/build-and-test.sh +++ b/docker/scripts/build-and-test.sh @@ -18,24 +18,27 @@ echo "Repo root is ${REPO_ROOT}" ls -ld "${REPO_ROOT}" cd "${REPO_ROOT}" -"$SCRIPT_DIR"/setup-workspace.sh "${HOME}/packages/lfmerge" +BUILD_DIR="${HOME}/packages/lfmerge" +echo "Setting up clean workspace in ${BUILD_DIR}" +"$SCRIPT_DIR"/setup-workspace.sh "${BUILD_DIR}" +cd "${BUILD_DIR}" -echo After setup-workspace.sh, pwd is $(pwd) -echo cd to "${HOME}/packages/lfmerge" -cd "${HOME}/packages/lfmerge" +# TODO: Can we get rid of this mkdir? +mkdir -p output/Release -"$SCRIPT_DIR"/gitversion-combined.sh ${DbVersion} +echo "Building packages for version ${DebPackageVersion}" -"$SCRIPT_DIR"/download-dependencies-combined.sh ${DbVersion} +# Explicit restore step so we can save time in later build steps by using --no-restore +echo "Downloading dependencies" +dotnet restore -v:m -"$SCRIPT_DIR"/compile-lfmerge-combined.sh ${DbVersion} +echo "Compiling LfMerge" +dotnet build --no-restore /v:m /property:Configuration=Release /property:DatabaseVersion=${DbVersion} LfMerge.sln if [ -n "$RUN_UNIT_TESTS" -a "$RUN_UNIT_TESTS" -ne 0 ]; then - "$SCRIPT_DIR"/test-lfmerge-combined.sh ${DbVersion} + echo "Running unit tests" + # TODO: Honor TEST_SPEC enviornment variable + dotnet test --no-restore -c Release fi -rm -rf "$SCRIPT_DIR"/data/php # So it doesn't get into the .deb source package - -# "$SCRIPT_DIR"/build-debpackages-combined.sh ${DbVersion} - "$SCRIPT_DIR"/create-installation-tarball.sh ${DbVersion} diff --git a/docker/scripts/compile-lfmerge-combined.sh b/docker/scripts/compile-lfmerge-combined.sh deleted file mode 100755 index 8b631ee0..00000000 --- a/docker/scripts/compile-lfmerge-combined.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -e - -set -e - -echo "Compiling LfMerge and running unit tests" -BUILD=Release . environ - -echo "Using $(which dotnet)" - -export DbVersion="${1-7000072}" -echo "Building for ${DbVersion}" - -dotnet build --no-restore /v:m /property:Configuration=Release /property:DatabaseVersion=${DbVersion} LfMerge.sln - -# ln -sf ../Mercurial output/ -# xbuild /t:TestOnly /v:detailed /property:Configuration=Release /property:DatabaseVersion=${DbVersion} build/LfMerge.proj diff --git a/docker/scripts/download-dependencies-combined.sh b/docker/scripts/download-dependencies-combined.sh deleted file mode 100755 index b63c693d..00000000 --- a/docker/scripts/download-dependencies-combined.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -e - -set -e - -echo "Downloading dependencies" -export MONO_PREFIX=/opt/mono5-sil -. environ - -pwd - -if [ "x$1" = "x7000072" ]; then -dotnet restore -v:m -else -msbuild /t:DownloadDependencies /p:KeepJobsFile=false build/LfMerge.proj -fi - diff --git a/docker/scripts/gitversion-combined.sh b/docker/scripts/gitversion-combined.sh deleted file mode 100755 index a216c702..00000000 --- a/docker/scripts/gitversion-combined.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -e - -SCRIPT_DIR=$(dirname $(readlink -f "$0")) - -echo "Calculated versions:" -echo "DebPackageVersion=${DebPackageVersion}" -echo "MajorMinorPatch=${MajorMinorPatch}" -echo "AssemblyVersion=${AssemblyVersion}" -echo "FileVersion=${FileVersion}" -echo "InformationalVersion=${InformationalVersion}" - -# Fetch tags for GitVersion -git fetch --tags - -# Fetch master for GitVersion -if [ -n "$GITHUB_REF" -a "x$GITHUB_REF" != "xrefs/heads/master" ]; then - git branch --create-reflog master origin/master -fi - -export MONO_PREFIX=/opt/mono5-sil -RUNMODE="PACKAGEBUILD" BUILD=Release . environ -# msbuild build/LfMerge.proj -mkdir -p output/Release - -echo "Building packages for version ${DebPackageVersion}" diff --git a/docker/scripts/test-lfmerge-combined.sh b/docker/scripts/test-lfmerge-combined.sh deleted file mode 100755 index 760a3a91..00000000 --- a/docker/scripts/test-lfmerge-combined.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -set -e - -export DbVersion="${1-7000072}" - -echo "Running unit tests for ${DbVersion}" -BUILD=Release . environ - -echo "Using $(which mono)" -export FrameworkPathOverride=/opt/mono5-sil/lib/mono/4.5 - -ln -sf ../Mercurial output/ -if [ -n "$TEST_SPEC" ]; then - echo Only running "$TEST_SPEC" - if [ "x$NUNIT_VERSION_MAJOR" = "x2" ]; then - mono packages/NUnit.Runners.Net4.2.6.4/tools/nunit-console.exe output/Release/LfMerge*.Tests.dll -run "$TEST_SPEC" - elif [ "x$NUNIT_VERSION_MAJOR" = "x3" ]; then - mono packages/NUnit.ConsoleRunner/tools/nunit3-console.exe output/Release/LfMerge*.Tests.dll --test "$TEST_SPEC" - else - echo Warning, NUnit version not specified. Assuming NUnit 3. - mono packages/NUnit.ConsoleRunner/tools/nunit3-console.exe output/Release/LfMerge*.Tests.dll --test "$TEST_SPEC" - fi -else - dotnet test --no-restore -c Release -fi From 1ea67e768195f998cedf304af34e2cfa186f14a4 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 20:25:36 +0700 Subject: [PATCH 10/30] Slash and burn: most of environ script, begone! We only need a few environment variables (such as adjusting the PATH to point to the version of Mercurial that we need to use), and soon we'll be able to get rid of those as well. --- environ | 72 ++------------------------------------------------------- 1 file changed, 2 insertions(+), 70 deletions(-) diff --git a/environ b/environ index 46ab43c6..fca98dab 100644 --- a/environ +++ b/environ @@ -1,78 +1,10 @@ -# Environment settings for running programs with the SIL version of mono -# Set MONO_ENVIRON to this file's pathname, then run, for example, -# /opt/mono5-sil/bin/mono --debug LfMerge.exe -# These settings assume that the packaged SIL Mono is installed in /opt/mono5-sil. +# A few necessary environment variables for the Mercurial build from Chorus to run correctly # Note that this file is intended to be "sourced", not "executed". # the sourcing script should cd/pushd to the directory containing this script BASE="$(pwd)" -DEFAULT_MONO_PREFIX=/opt/mono5-sil -[ -z "$BUILD" ] && BUILD=Debug -[ -z "$MONO_PREFIX" ] && MONO_PREFIX=${DEFAULT_MONO_PREFIX} -MONO_DEBUG=explicit-null-checks -MONO_ENV_OPTIONS="-O=-gshared" - -if [ "$RUNMODE" != "NUGET" ]; then - [ -z "$DBVERSIONPATH" ] && DBVERSIONPATH=$(find /usr/lib/lfmerge -maxdepth 1 -type d -name [0-9]\* | sort | tail -n 1) - COMPONENTS_MAP_PATH=$DBVERSIONPATH -fi -ICU_DATA=/usr/share/fieldworks/Icu54 - -################################################################################################ - -if [ "$RUNMODE" = "INSTALLED" ] -then - # Add the installation directory to the library paths - LD_LIBRARY_PATH="${BASE}:${LD_LIBRARY_PATH}" - MONO_PATH="${BASE}:${MONO_PATH}" -else - # Add the build output to paths - PATH="${BASE}/output/${BUILD}:${BASE}/output/Mercurial:${PATH}" - LD_LIBRARY_PATH="${BASE}/output/${BUILD}:${LD_LIBRARY_PATH}" - MONO_PATH="${BASE}/output/${BUILD}:${MONO_PATH}" - [ -f "${BASE}/output/${BUILD}/components.map" ] && COMPONENTS_MAP_PATH="${BASE}/output/${BUILD}" -fi - -################################################################################################ - -if [ "$RUNMODE" = "PACKAGE" -o "$RUNMODE" = "INSTALLED" ] -then - # Add packaged mono items to paths - PATH="${DEFAULT_MONO_PREFIX}/bin:${PATH}" - LD_LIBRARY_PATH="${DEFAULT_MONO_PREFIX}/lib:${LD_LIBRARY_PATH}" - PKG_CONFIG_PATH="${DEFAULT_MONO_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}" - MONO_GAC_PREFIX="${DEFAULT_MONO_PREFIX}:/usr" -else - # Add locally-built mono items to paths - # We also add the default values for PKG_CONFIG_PATH - MonoDevelop resets the PKG_CONFIG_PATH - # environment variable if we're running under a different Mono runtime so that some - # packages that got installed in standard locations can't be found otherwise. - PATH="${MONO_PREFIX}/bin:${PATH}" - LD_LIBRARY_PATH="${MONO_PREFIX}/lib:${LD_LIBRARY_PATH}" - PKG_CONFIG_PATH="${MONO_PREFIX}/lib/pkgconfig:${PKG_CONFIG_PATH}:/usr/local/lib/pkgconfig:/lib/pkgconfig:/usr/lib/pkgconfig" - MONO_GAC_PREFIX="${MONO_PREFIX}:/usr" -fi - -################################################################################################ - -LD_LIBRARY_PATH="${DBVERSIONPATH}:${LD_LIBRARY_PATH}" - -FW_ROOTCODE=/usr/share/fieldworks - -MONO_TRACE_LISTENER="Console.Out" - -# if debugging for performance unset DEBUG_ENABLE_PTR_VALIDATION env var. -#export DEBUG_ENABLE_PTR_VALIDATION=1 - -export \ - PATH LD_LIBRARY_PATH PKG_CONFIG_PATH LD_PRELOAD \ - COMPONENTS_MAP_PATH ICU_DATA \ - MONO_PATH \ - MONO_PREFIX MONO_GAC_PREFIX \ - MONO_TRACE_LISTENER \ - MONO_DEBUG MONO_ENV_OPTIONS \ - FW_ROOTCODE +export PATH="${BASE}/output/${BUILD}:${BASE}/output/Mercurial:${PATH}" # set HGRCPATH so that we ignore ~/.hgrc files which might have content that is # incompatible with our version of Mercurial From 241c4f15b5cbb4f285c303f9712faaa93db18de0 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 21:19:31 +0700 Subject: [PATCH 11/30] Mount user's home nuget folder as cache Instead of using a non-standard `/storage/nuget` folder that won't be on most people's computers, use the NuGet package cache that they alreday have, located in `~/.nuget/packages`. Because if they're using VS Code or any other IDE that knows about .NET and NuGet, that folder is probably already populated with the appropriate packages, which makes even the first build go faster. --- pbuild.sh | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/pbuild.sh b/pbuild.sh index 064f5aa3..c5704153 100755 --- a/pbuild.sh +++ b/pbuild.sh @@ -32,13 +32,6 @@ HISTORICAL_VERSIONS=(7000068 7000069 7000070) # ATTENTION: Stop uncommenting here -mkdir -p /storage/nuget -if [ $? -ne 0 ]; then - echo "Please create a /storage directory and then run 'chown ${USER} /storage', to be able to cache NuGet packages" - exit 1 -fi -# TODO: Check for rwxrwsr-x permissions and appropriate uid/gid settings - # Find appropriate branch(es) to build FW9_BUILD_BRANCH="$(git name-rev --name-only HEAD)" echo Will build ONLY the FW9 build, from "${FW9_BUILD_BRANCH}" @@ -69,7 +62,7 @@ done for DbVersion in ${DBMODEL_VERSIONS[@]}; do docker run -it \ --mount type=bind,source="$(pwd)",target=/home/builder/repo \ - --mount type=bind,src=/storage/nuget,dst=/home/builder/.nuget/packages \ + --mount type=bind,src="${HOME}/.nuget/packages",dst=/home/builder/.nuget/packages \ --mount type=tmpfs,dst=/tmp \ --env "BRANCH_TO_BUILD=${FW9_BUILD_BRANCH}" \ --env "BUILD_NUMBER=999" \ From 5152959fcda9b52e51b30c856b222534fcea6e8b Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Thu, 18 Aug 2022 22:15:47 +0700 Subject: [PATCH 12/30] Slightly simpler handling of SIL.Chorus.Mercurial PrivateAssets="All" is a simpler way to pull in the build targets we need from that package. --- src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj | 2 +- src/LfMerge.Core/LfMerge.Core.csproj | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj b/src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj index 087d09d1..614038aa 100644 --- a/src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj +++ b/src/LfMerge.Core.Tests/LfMerge.Core.Tests.csproj @@ -35,7 +35,7 @@ See full changelog at https://github.com/sillsdev/LfMerge/blob/master/CHANGELOG. - + diff --git a/src/LfMerge.Core/LfMerge.Core.csproj b/src/LfMerge.Core/LfMerge.Core.csproj index e884932a..253657e9 100644 --- a/src/LfMerge.Core/LfMerge.Core.csproj +++ b/src/LfMerge.Core/LfMerge.Core.csproj @@ -39,9 +39,7 @@ See full changelog at https://github.com/sillsdev/LfMerge/blob/master/CHANGELOG. - - contentfiles;analyzers - + @@ -51,10 +49,6 @@ See full changelog at https://github.com/sillsdev/LfMerge/blob/master/CHANGELOG. - - - - chorusmerge From 57c41bfc3796d00ff4239718d2152e39eaec8dc0 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 11:09:03 +0700 Subject: [PATCH 13/30] Honor TEST_SPEC env var in unit testing Set TEST_SPEC to a partial (or full) name of a test class or test method and `dotnet test` will use a "name contains X" filter to locate tests. --- docker/scripts/build-and-test.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docker/scripts/build-and-test.sh b/docker/scripts/build-and-test.sh index 7c8f6a49..fa1891d9 100755 --- a/docker/scripts/build-and-test.sh +++ b/docker/scripts/build-and-test.sh @@ -37,8 +37,14 @@ dotnet build --no-restore /v:m /property:Configuration=Release /property:Databas if [ -n "$RUN_UNIT_TESTS" -a "$RUN_UNIT_TESTS" -ne 0 ]; then echo "Running unit tests" - # TODO: Honor TEST_SPEC enviornment variable - dotnet test --no-restore -c Release + # dotnet test defaults to killing test processes after 100ms, which is way too short + export VSTEST_TESTHOST_SHUTDOWN_TIMEOUT=30000 # 30 seconds, please, since some of our tests can run very long + # Treat TEST_SPEC enviornment variable as a "contains" operation + if [ -n "$TEST_SPEC" ]; then + dotnet test --no-restore -c Release --filter "FullyQualifiedName~${TEST_SPEC}" + else + dotnet test --no-restore -c Release + fi fi "$SCRIPT_DIR"/create-installation-tarball.sh ${DbVersion} From a1f1a98cd3d67de83bfc7fb27ad35f75745529cb Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 11:10:21 +0700 Subject: [PATCH 14/30] VS Code launch settings for debugging unit tests To use this, choose the "Run Test Task" command in VS Code. The dotnet test will run, then pause waiting for a debugger to attach. Go to the debug menu and choose the "Attach" configuration, then enter the PID printed on the test console. (There will be two, one for LfMerge.Tests and one for LfMerge.Core.Tests; most of the tests are in LfMerge.Core so that's the one you'll need most of the time). The debugger will attach to the test process, which is still in a paused state. Set any breakpoints you want to hit in the unit tests, then unpause the debugger and it will start running the unit tests. --- .vscode/launch.json | 33 ++++++------------------------- .vscode/tasks.json | 47 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 27 deletions(-) create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json index b2826621..8408899d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -34,31 +34,10 @@ } }, */ - { - "name": "Launch unit tests", - "env": { - // Display on main display :0, or on a Xephyr :2. - "DISPLAY": ":0", - // When launching LfMerge, use this mono. - "PATH": "/opt/mono5-sil/bin:${env:PATH}", - // Path to the rest of the necessary enviromnent settings for LfMerge. This is handled by a mono wrapper script in /opt. - "MONO_ENVIRON": "${workspaceRoot}/environ" - }, - "type": "mono", - "request": "launch", - "program": "${workspaceRoot}/packages/NUnit.Runners.Net4.2.6.4/tools/nunit.exe", - "args": [ - "LfMerge.Core.Tests.dll" - ], - "cwd": "${workspaceRoot}/output/Debug", - "console": "integratedTerminal" - }, - { - "name": "Attach", - "type": "mono", - "request": "attach", - "address": "localhost", - "port": 55555 - } - ] + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + }, + ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..10eccd27 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,47 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "shell", + "args": [ + "build", + // Ask dotnet build to generate full paths for file names. + "/property:GenerateFullPaths=true", + // Do not generate summary otherwise it leads to duplicate errors in Problems panel + "/consoleloggerparameters:NoSummary" + ], + "group": "build", + "presentation": { + "reveal": "silent" + }, + "problemMatcher": "$msCompile" + }, + { + "label": ".NET Core Test with debugger", + "type": "process", + "isBackground": true, + "command": "dotnet", + "args": [ "test", "--filter", "FullyQualifiedName=LfMerge.Core.Tests.Lcm.DataConverters.ConvertLcmToMongoCustomFieldTests.GetCustomFieldForThisCmObject_ShouldGetMultiListRef" ], + "options": + { + "cwd": "${workspaceFolder}", + "env": + { + "VSTEST_HOST_DEBUG": "1" + }, + }, + "group": "test", "presentation": + { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared" + }, + "problemMatcher": [] + }, + ] +} \ No newline at end of file From ab5d11a7496a003a0852c25ed446a263f580d54b Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 11:13:31 +0700 Subject: [PATCH 15/30] Stop caching in LfMergeSettings so unit tests work LfMergeSettings was caching the value of environment variables, but some strings like BaseDir were being accessed in the constructor, before derived classes like LfMergeSettingsDouble had a chance to change them. This meant that many tests, which relied on testlangproj or other projects being copied into the test's temp dir, were failing because LfMergeSettings was using the default /var/lib/languageforge/... base directory instead. By removing the caching, we ensure that the LfMergeSettingsDouble class is able to change the BaseDir correctly. --- src/LfMerge.Core/Settings/LfMergeSettings.cs | 105 ++++--------------- 1 file changed, 20 insertions(+), 85 deletions(-) diff --git a/src/LfMerge.Core/Settings/LfMergeSettings.cs b/src/LfMerge.Core/Settings/LfMergeSettings.cs index 6baf6f8d..7df532c4 100644 --- a/src/LfMerge.Core/Settings/LfMergeSettings.cs +++ b/src/LfMerge.Core/Settings/LfMergeSettings.cs @@ -10,121 +10,55 @@ namespace LfMerge.Core.Settings { public class LfMergeSettings { - private string _baseDir = null; - private string _webworkDir = null; - private string _templatesDir = null; - private string _mongoHostname = null; - private int _mongoPort = 0; - private string _mongoMainDatabaseName = null; - private string _mongoDatabaseNamePrefix = null; - private string _verboseProgressStr = null; - private bool _verboseProgress = false; - private string _languageDepotRepoUri = null; - // Settings derived from environment variables - public string BaseDir { - get { - if (_baseDir != null) return _baseDir; - else { - _baseDir = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_BaseDir) ?? DefaultLfMergeSettings.BaseDir; - return _baseDir; - } - } - } + public string BaseDir => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_BaseDir) ?? DefaultLfMergeSettings.BaseDir; public string WebworkDir { get { - if (_webworkDir != null) return _webworkDir; - else { - _webworkDir = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_WebworkDir) ?? DefaultLfMergeSettings.WebworkDir; - _webworkDir = Path.IsPathRooted(_webworkDir) ? _webworkDir : Path.Combine(BaseDir, _webworkDir); - return _webworkDir; - } + string _webworkDir = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_WebworkDir) ?? DefaultLfMergeSettings.WebworkDir; + _webworkDir = Path.IsPathRooted(_webworkDir) ? _webworkDir : Path.Combine(BaseDir, _webworkDir); + return _webworkDir; } } public string TemplatesDir { get { - if (_templatesDir != null) return _templatesDir; - else { - _templatesDir = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_TemplatesDir) ?? DefaultLfMergeSettings.TemplatesDir; - _templatesDir = Path.IsPathRooted(_templatesDir) ? _templatesDir : Path.Combine(BaseDir, _templatesDir); - return _templatesDir; - } + string _templatesDir = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_TemplatesDir) ?? DefaultLfMergeSettings.TemplatesDir; + _templatesDir = Path.IsPathRooted(_templatesDir) ? _templatesDir : Path.Combine(BaseDir, _templatesDir); + return _templatesDir; } } - public string MongoHostname { - get { - if (_mongoHostname != null) return _mongoHostname; - else { - _mongoHostname = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoHostname) ?? DefaultLfMergeSettings.MongoHostname; - return _mongoHostname; - } - } - } + public string MongoHostname => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoHostname) ?? DefaultLfMergeSettings.MongoHostname; public int MongoPort { get { - if (_mongoPort != 0) return _mongoPort; - else { - string mongoPortStr = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoPort); - if (mongoPortStr == null) mongoPortStr = ""; - if (Int32.TryParse(mongoPortStr, out _mongoPort)) { - return _mongoPort; - } else { - _mongoPort = DefaultLfMergeSettings.MongoPort; - return _mongoPort; - } + string _mongoPortStr = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoPort); + if (_mongoPortStr == null) _mongoPortStr = ""; + if (Int32.TryParse(_mongoPortStr, out int _mongoPort)) { + return _mongoPort; + } else { + return DefaultLfMergeSettings.MongoPort; } } } - public string MongoMainDatabaseName { - get { - if (_mongoMainDatabaseName != null) return _mongoMainDatabaseName; - else { - _mongoMainDatabaseName = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoMainDatabaseName) ?? DefaultLfMergeSettings.MongoMainDatabaseName; - return _mongoMainDatabaseName; - } - } - } + public string MongoMainDatabaseName => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoMainDatabaseName) ?? DefaultLfMergeSettings.MongoMainDatabaseName; ///

/// The prefix prepended to project codes to get the Mongo database name. /// - public string MongoDatabaseNamePrefix { - get { - if (_mongoDatabaseNamePrefix != null) return _mongoDatabaseNamePrefix; - else { - _mongoDatabaseNamePrefix = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoDatabaseNamePrefix) ?? DefaultLfMergeSettings.MongoDatabaseNamePrefix; - return _mongoDatabaseNamePrefix; - } - } - } + public string MongoDatabaseNamePrefix => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoDatabaseNamePrefix) ?? DefaultLfMergeSettings.MongoDatabaseNamePrefix; public bool VerboseProgress { get { - if (_verboseProgressStr != null) return _verboseProgress; - else { - _verboseProgressStr = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_VerboseProgress); - if (_verboseProgressStr == null) _verboseProgressStr = ""; - _verboseProgress = LanguageForge.Model.ParseBoolean.FromString(_verboseProgressStr); - return _verboseProgress; - } + string _verboseProgressStr = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_VerboseProgress) ?? ""; + return LanguageForge.Model.ParseBoolean.FromString(_verboseProgressStr); } } - public string LanguageDepotRepoUri { - get { - if (_languageDepotRepoUri != null) return _languageDepotRepoUri; - else { - _languageDepotRepoUri = Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_LanguageDepotRepoUri) ?? DefaultLfMergeSettings.LanguageDepotRepoUri; - return _languageDepotRepoUri; - } - } - } + public string LanguageDepotRepoUri => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_LanguageDepotRepoUri) ?? DefaultLfMergeSettings.LanguageDepotRepoUri; // Settings calculated at runtime from sources other than environment variables @@ -150,6 +84,7 @@ public LfMergeSettings() public void Initialize() { // TODO: Get rid of this once we simplify the queue system. 2022-02 RM + SetAllMembers(); Queue.CreateQueueDirectories(this); } From 90310f5da6f9876ef1fc4d49247455caeeba7e99 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 11:40:11 +0700 Subject: [PATCH 16/30] Fix nine more failing unit tests ProcessingState tests need their expected results updated to include the new Error property, and the MercurialServer code needs to update its "shutdown the server" logic to expect "kill" to be a shell builtin rather than a separate binary. That fixes a total of 9 failing tests. --- src/LfMerge.Core.Tests/MercurialServer.cs | 2 +- src/LfMerge.Core.Tests/ProcessingStateTests.cs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/LfMerge.Core.Tests/MercurialServer.cs b/src/LfMerge.Core.Tests/MercurialServer.cs index c8c0fa03..5573d712 100644 --- a/src/LfMerge.Core.Tests/MercurialServer.cs +++ b/src/LfMerge.Core.Tests/MercurialServer.cs @@ -46,7 +46,7 @@ public void Stop() var pid = File.ReadAllText(_pidFile); if (Platform.IsLinux) { - CommandLineRunner.Run("kill", "-9 " + pid, Directory.GetCurrentDirectory(), + CommandLineRunner.Run("sh", "-c 'kill -9 " + pid + "'", Directory.GetCurrentDirectory(), 120, new NullProgress()); } else diff --git a/src/LfMerge.Core.Tests/ProcessingStateTests.cs b/src/LfMerge.Core.Tests/ProcessingStateTests.cs index 02dee0f6..290ea1bf 100644 --- a/src/LfMerge.Core.Tests/ProcessingStateTests.cs +++ b/src/LfMerge.Core.Tests/ProcessingStateTests.cs @@ -138,6 +138,7 @@ public void State_SettingProperty_SerializesState() ""CurrentStep"": 1, ""RetryCounter"": 2, ""UncommittedEditCounter"": 0, + ""Error"": null, ""ErrorMessage"": null, ""ErrorCode"": 0, ""PreviousRunTotalMilliseconds"": 0, From aefe043bd61e6d0ce37baf48903ccbc9e54a8d49 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 12:35:07 +0700 Subject: [PATCH 17/30] Allow testing uncommitted code By removing the `git checkout` and `git clean` steps, we ensure that we can run the build process against uncomitted code in the repository. This will make testing changes much simpler. A leter commit will probably remove the copying of the Git repo into a temporary working directory, and simply run the build in the user's repo via a bind mount. That will mean that build outputs (such as TestResult directories) will end up in your repo, which will be useful in any situation where you want to debug the unit tests. --- docker/scripts/setup-workspace.sh | 6 ------ pbuild.sh | 1 - 2 files changed, 7 deletions(-) diff --git a/docker/scripts/setup-workspace.sh b/docker/scripts/setup-workspace.sh index 6f49d1a1..e605b70e 100755 --- a/docker/scripts/setup-workspace.sh +++ b/docker/scripts/setup-workspace.sh @@ -12,9 +12,3 @@ sudo cp -a "${REPO_ROOT}"/* "${REPO_ROOT}"/.[a-zA-Z0-9]* "${DEST}" sudo chown -R builder:users "${DEST}" cd "${DEST}" -if [ "${BRANCH_TO_BUILD}" ]; then - git checkout "${BRANCH_TO_BUILD}" -fi - -git clean -dxf -git reset --hard diff --git a/pbuild.sh b/pbuild.sh index c5704153..7423db41 100755 --- a/pbuild.sh +++ b/pbuild.sh @@ -64,7 +64,6 @@ for DbVersion in ${DBMODEL_VERSIONS[@]}; do --mount type=bind,source="$(pwd)",target=/home/builder/repo \ --mount type=bind,src="${HOME}/.nuget/packages",dst=/home/builder/.nuget/packages \ --mount type=tmpfs,dst=/tmp \ - --env "BRANCH_TO_BUILD=${FW9_BUILD_BRANCH}" \ --env "BUILD_NUMBER=999" \ --env "DebPackageVersion=${DebPackageVersion}" \ --env "Version=${MsBuildVersion}" \ From ba6c8192f319a3baf57e98991445ce92406a98ae Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 12:50:38 +0700 Subject: [PATCH 18/30] Remove lfmerge.conf (replaced by env vars) Now that LfMergeSettings uses environment variables, we no longer need to copy lfmerge.conf into the final Docker image. This resolves a long-standing TODO. --- Dockerfile.finalresult | 2 -- lfmerge.conf | 10 ---------- 2 files changed, 12 deletions(-) delete mode 100644 lfmerge.conf diff --git a/Dockerfile.finalresult b/Dockerfile.finalresult index 0bf9a505..24a2a2ec 100644 --- a/Dockerfile.finalresult +++ b/Dockerfile.finalresult @@ -23,8 +23,6 @@ RUN mkdir -m 02775 -p /var/lib/languageforge/lexicon/sendreceive/syncqueue /var/ RUN install -d -o www-data -g www-data -m 02775 /var/run/lfmerge -# TODO: Turn this into environment variables, because we want to be able to just set env vars in k8s config and restart the container -COPY lfmerge.conf /etc/languageforge/conf/sendreceive.conf COPY sudoers.d.lfmerge.conf /etc/sudoers.d/lfmerge COPY mercurial-cacerts.rc /etc/mercurial/hgrc COPY lfmergeqm-background.sh / diff --git a/lfmerge.conf b/lfmerge.conf deleted file mode 100644 index 45715cd6..00000000 --- a/lfmerge.conf +++ /dev/null @@ -1,10 +0,0 @@ -# Configuration file for LfMerge -BaseDir = /var/lib/languageforge/lexicon/sendreceive -WebworkDir = webwork -TemplatesDir = Templates -MongoHostname = db -MongoPort = 27017 -MongoMainDatabaseName = scriptureforge -MongoDatabaseNamePrefix = sf_ -VerboseProgress = true -PhpSourcePath = /var/www/html From b17ddf0460197bf486fa216b244c2a8977e9eff1 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 12:52:08 +0700 Subject: [PATCH 19/30] Remove rsyslog from final Dockerfile Now that LfMerge logs to the console rather than syslog, we don't need rsyslog or its config files in the final Docker image. --- Dockerfile.finalresult | 8 ++------ entrypoint.sh | 12 ------------ 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/Dockerfile.finalresult b/Dockerfile.finalresult index 24a2a2ec..48a541b7 100644 --- a/Dockerfile.finalresult +++ b/Dockerfile.finalresult @@ -6,16 +6,12 @@ FROM ghcr.io/sillsdev/lfmerge-base:runtime # install LFMerge prerequisites # tini - PID 1 handler # python - required by Mercurial, which is bundled in the LFMerge installation -# rsyslog - lfmerge logs to rsyslog and expects this to exist -# rsyslog customizations (imklog reads kernel messages, which isn't allowed or desired in Docker containers) -# logrotate - ensure logs won't grow without bound, and that old logs get cleaned up automatically # iputils-ping - Chorus (part of LFMerge) requires the "ping" command to be available on the command line # less - so we can read syslog during manual debugging of issues # vim-tiny - so we can edit state files (to change HOLD to IDLE) during manual debugging of issues RUN apt-get update \ -&& apt-get install --yes --no-install-recommends tini python rsyslog logrotate iputils-ping inotify-tools less vim-tiny \ -&& rm -rf /var/lib/apt/lists/* \ -&& sed -i '/load="imklog"/s/^/#/' /etc/rsyslog.conf + && apt-get install --yes --no-install-recommends tini python iputils-ping inotify-tools less vim-tiny \ + && rm -rf /var/lib/apt/lists/* ADD tarball/lfmerge* / diff --git a/entrypoint.sh b/entrypoint.sh index c3dd2c5a..19780923 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -5,18 +5,6 @@ echo Entrypoint running with args "$@" # Catch SIGTERM and exit cleanly trap "exit" TERM -# rsyslog needs to run so that lfmerge can log to /var/log/syslog -/etc/init.d/rsyslog start - -# Ensure /var/log/syslog exists so tail -f /var/log/syslog will run -logger "Starting container..." -# echo /var/log/syslog to container stdout so it shows up in `kubectl logs` -# First waiting for syslog to exist (race condition: `logger` can return before syslog file is created) -until [ -r /var/log/syslog ]; do - sleep 0.2 -done -tail -f /var/log/syslog & - # run lfmergeqm on startup to clear out any failed send/receive sessions from previous container /lfmergeqm-background.sh & # MUST be run as a background process as it kicks off an infinite loop to run every 24 hours From 20e839d2d03526e795f949ccff6949c599f4be1e Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 13:12:08 +0700 Subject: [PATCH 20/30] Use same checkout action in entire GHA workflow One step was still using version 2.4.0 even though the rest of the workflow had moved to version 3.0.2. --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a0a4d450..051b23aa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3.0.2 with: fetch-depth: 0 From 1fce995ae53fe1e5a1f244b9f99387c9140ca31b Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 13:14:26 +0700 Subject: [PATCH 21/30] Remove entire calculate-branches build step This was needed when we were building FW8 and FW9 builds from different branches, but it's no longer useful. The only thing it was still being used for is in figuring out which branch to tag in the release workflow, but since we only run that step when the branch is "live" anyway, we can just hardcode the branch name. Yet more build complexity, begone! --- .github/workflows/docker-build.yml | 32 ------------------------------ .github/workflows/release.yml | 7 +------ 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index d8141ac2..be847ee7 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -10,31 +10,8 @@ on: workflow_dispatch: jobs: - calculate_branches: - runs-on: ubuntu-latest - steps: - - name: Check out current branch - uses: actions/checkout@v3.0.2 - with: - fetch-depth: 0 # All history for all tags and branches, since branch calculation step needs that - - - name: Calculate branches to build - run: | - echo "${GITHUB_REF}" - ./calculate-branches.sh --no-fw8 | grep FW9Branch >> "${GITHUB_ENV}" - - - name: Save branch names in output - id: branches_to_build - run: | - echo "FW9Branch=${FW9Branch}" - echo "::set-output name=FW9Branch::${FW9Branch}" - - outputs: - FW9Branch: ${{ steps.branches_to_build.outputs.FW9Branch }} - build: runs-on: ubuntu-latest - needs: calculate_branches # As of 2022-08-16, we build LfMerge for LCM DB version 72 only (and will expand this to include any future DbVersions) strategy: @@ -48,13 +25,6 @@ jobs: with: fetch-depth: 0 # All history for all tags and branches, since version number script needs that - - name: Verify current branch - run: | - git branch --contains HEAD --format '%(refname)' - echo FW9 was "${FW9Branch}" - env: - FW9Branch: ${{ needs.calculate_branches.outputs.FW9Branch }} - - name: Calculate version number id: version env: @@ -121,7 +91,6 @@ jobs: outputs: MsBuildVersion: ${{ steps.output_version_number.outputs.VersionFor7000072 }} TagFor7000072: ${{ steps.output_version_number.outputs.TagFor7000072 }} - FW9Branch: ${{ needs.calculate_branches.outputs.FW9Branch }} release: needs: build @@ -129,4 +98,3 @@ jobs: with: MsBuildVersion: ${{ needs.build.outputs.MsBuildVersion }} TagFor7000072: ${{ needs.build.outputs.TagFor7000072 }} - FW9Branch: ${{ needs.build.outputs.FW9Branch }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 051b23aa..15242e4a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,9 +6,6 @@ on: MsBuildVersion: required: true type: string - FW9Branch: - required: true - type: string TagFor7000072: required: true type: string @@ -30,13 +27,11 @@ jobs: - name: Tag release branches if: github.event_name == 'push' && github.ref == 'refs/heads/live' - env: - FW9Branch: ${{ inputs.FW9Branch }} TAG72: ${{ inputs.TagFor7000072 }} run: | git config --global user.name "github-actions" git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git tag -f -a -m "Release ${TAG72}" "${TAG72}" "refs/remotes/origin/${FW9Branch}" + git tag -f -a -m "Release ${TAG72}" "${TAG72}" "refs/remotes/origin/live" git push -v origin "${TAG72}" - name: Download build artifacts From 0cc542463640ddd7d281e50d3b75a20e9d0439a9 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 13:25:12 +0700 Subject: [PATCH 22/30] Remove unnecessary step from release workflow This fulfills a long-standing TODO comment. --- .github/workflows/release.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 15242e4a..bf430d1e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,16 +49,6 @@ jobs: - name: Verify that uncompress step worked run: ls -lR tarball - - name: Restore executable bits - # GitHub artifacts system strips executable bits, so restore them here - # TODO: Now that we upload .tar.gz format, no longer needed since tar format preserves Unix permissions. Verify, then remove this section - run: | - chmod +x tarball/lfmerge*/usr/bin/lfmerge - chmod +x tarball/lfmerge*/usr/bin/lfmergeqm - chmod +x tarball/lfmerge*/usr/lib/lfmerge/*/chorusmerge - chmod +x tarball/lfmerge*/usr/lib/lfmerge/*/startlfmerge - chmod +x tarball/lfmerge*/usr/lib/lfmerge/*/Mercurial/hg - - name: Login to GHCR if: github.event_name == 'push' && github.ref == 'refs/heads/live' uses: docker/login-action@v1 From 0f1ba67f5b7b01bb8af4961b133300fcfe49a07e Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 13:41:55 +0700 Subject: [PATCH 23/30] Run build directly in repo (no more copying) This allows the build to create the installation tarball directly in the bind-mounted repo, eliminating a copy step. --- .github/workflows/docker-build.yml | 3 --- Dockerfile | 12 ++++++++---- docker/scripts/build-and-test.sh | 8 -------- docker/scripts/create-installation-tarball.sh | 5 +++-- docker/scripts/setup-workspace.sh | 14 -------------- pbuild.sh | 6 ------ 6 files changed, 11 insertions(+), 37 deletions(-) delete mode 100755 docker/scripts/setup-workspace.sh diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index be847ee7..5c5a1c04 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -78,9 +78,6 @@ jobs: InformationalVersion: ${{ steps.version.outputs.InformationalVersion }} run: docker run --mount type=bind,source="$(pwd)",target=/home/builder/repo --env "BUILD_NUMBER=${BUILD_NUMBER}" --env "DebPackageVersion=${DebPackageVersion}" --env "Version=${MsBuildVersion}" --env "MajorMinorPatch=${MajorMinorPatch}" --env "AssemblyVersion=${AssemblySemVer}" --env "FileVersion=${AssemblySemFileVer}" --env "InformationalVersion=${InformationalVersion}" --name tmp-lfmerge-build-${{matrix.dbversion}} lfmerge-build-${{matrix.dbversion}} - - name: Collect tarball images - run: docker container cp tmp-lfmerge-build-${{matrix.dbversion}}:/home/builder/packages/lfmerge/tarball ./ - - name: Compress tarball images for faster uploads run: time (tar cf - tarball | gzip -c9 > tarball.tar.gz) diff --git a/Dockerfile b/Dockerfile index ccb1eeb2..4843960c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,10 +30,14 @@ RUN mkdir -p /var/lib/languageforge/lexicon/sendreceive/ \ && chown -R builder:users /var/lib/languageforge/lexicon/sendreceive USER builder +WORKDIR /home/builder/repo +# Git repo should be mounted under /home/builder/repo when run +# E.g., `docker run --mount type=bind,source="$(pwd)",target=/home/builder/repo -# Git repo should be mounted under ${HOME}/packages/lfmerge when run -# E.g., `docker run --mount type=bind,source="$(pwd)",target=/home/builder/packages/lfmerge` -RUN mkdir -p /home/builder/repo /home/builder/packages/lfmerge /home/builder/.nuget/packages -CMD /home/builder/repo/docker/scripts/build-and-test.sh ${DbVersion} +# NuGet package cache dir should be bind-mounted from home of running user +# E.g., `docker run --mount type=bind,source="${HOME}/.nuget/packages",target=/home/builder/.nuget/packages +RUN mkdir -p /home/builder/.nuget/packages + +CMD docker/scripts/build-and-test.sh ${DbVersion} # CMD doesn't actually run the script, it just gives `docker run` a default. # So it's okay for the Git repo to not be mounted yet. diff --git a/docker/scripts/build-and-test.sh b/docker/scripts/build-and-test.sh index fa1891d9..67572653 100755 --- a/docker/scripts/build-and-test.sh +++ b/docker/scripts/build-and-test.sh @@ -18,14 +18,6 @@ echo "Repo root is ${REPO_ROOT}" ls -ld "${REPO_ROOT}" cd "${REPO_ROOT}" -BUILD_DIR="${HOME}/packages/lfmerge" -echo "Setting up clean workspace in ${BUILD_DIR}" -"$SCRIPT_DIR"/setup-workspace.sh "${BUILD_DIR}" -cd "${BUILD_DIR}" - -# TODO: Can we get rid of this mkdir? -mkdir -p output/Release - echo "Building packages for version ${DebPackageVersion}" # Explicit restore step so we can save time in later build steps by using --no-restore diff --git a/docker/scripts/create-installation-tarball.sh b/docker/scripts/create-installation-tarball.sh index 359797f0..b043221d 100755 --- a/docker/scripts/create-installation-tarball.sh +++ b/docker/scripts/create-installation-tarball.sh @@ -14,9 +14,10 @@ export NETSTANDARD=netstandard2.0 export DatabaseVersion=${1:-7000072} # Model version dependent DESTDIR -export DBDESTDIR=tarball/lfmerge-${DatabaseVersion} +export DESTROOT=tarball +export DBDESTDIR=${DESTROOT}/lfmerge-${DatabaseVersion} # Common DESTDIR -export COMMONDESTDIR=tarball/lfmerge +export COMMONDESTDIR=${DESTROOT}/lfmerge export LIB=usr/lib/lfmerge/${DatabaseVersion} export SHARE=usr/share/lfmerge/${DatabaseVersion} export NATIVERUNTIME=runtimes/linux-x64/native diff --git a/docker/scripts/setup-workspace.sh b/docker/scripts/setup-workspace.sh deleted file mode 100755 index e605b70e..00000000 --- a/docker/scripts/setup-workspace.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -set -e - -DEST="${1:-${HOME}/packages/lfmerge}" -mkdir -p "${DEST}" - -REPO_ROOT="$(git rev-parse --show-toplevel)" - -# cp -a "${REPO_ROOT}" "${DEST}" creates ${DEST}/repo and then everything is under there. That's not actually what we want. So... -sudo cp -a "${REPO_ROOT}"/* "${REPO_ROOT}"/.[a-zA-Z0-9]* "${DEST}" -sudo chown -R builder:users "${DEST}" - -cd "${DEST}" diff --git a/pbuild.sh b/pbuild.sh index 7423db41..7884756c 100755 --- a/pbuild.sh +++ b/pbuild.sh @@ -75,10 +75,4 @@ for DbVersion in ${DBMODEL_VERSIONS[@]}; do lfmerge-build-${DbVersion} done -# Collect results -mkdir -p tarball -for DbVersion in ${DBMODEL_VERSIONS[@]}; do - docker container cp tmp-lfmerge-build-${DbVersion}:/home/builder/packages/lfmerge/tarball ./ -done - time docker build -t ghcr.io/sillsdev/lfmerge -f Dockerfile.finalresult . From c8312f5707567a173687e76a82bf5c0ec1f16426 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 13:58:58 +0700 Subject: [PATCH 24/30] Add sanity check to installation script --- docker/scripts/create-installation-tarball.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docker/scripts/create-installation-tarball.sh b/docker/scripts/create-installation-tarball.sh index b043221d..ff29f99f 100755 --- a/docker/scripts/create-installation-tarball.sh +++ b/docker/scripts/create-installation-tarball.sh @@ -24,6 +24,15 @@ export NATIVERUNTIME=runtimes/linux-x64/native export LIBRUNTIME=runtimes/linux-x64/lib export DBVERSIONPATH=/usr/lib/lfmerge/${DatabaseVersion} +# Sanity check before doing anything destructive +if [ -d output/${BUILD}/${FRAMEWORK}/ -a -e output/${BUILD}/${FRAMEWORK}/LfMerge.Core.dll ] +then + echo "Copying installation files into ${DESTROOT}" +else + echo "Build appears to have failed; not touching ${DESTROOT}" + exit 1 +fi + # Apparently the downloaded mercurial.ini doesn't have the right fixutf8 config, and it also # has wrong line endings, so we re-create the entire file cat >Mercurial/mercurial.ini < Date: Fri, 19 Aug 2022 14:14:29 +0700 Subject: [PATCH 25/30] Fix workflow syntax error --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bf430d1e..6eb33fd8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,6 +27,7 @@ jobs: - name: Tag release branches if: github.event_name == 'push' && github.ref == 'refs/heads/live' + env: TAG72: ${{ inputs.TagFor7000072 }} run: | git config --global user.name "github-actions" From 318dca9f8861f03c267ab7d9357db0b22fe38318 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 14:49:24 +0700 Subject: [PATCH 26/30] Remove previous installation files if they exist This will avoid the possibility of creating a "mixed" lfmerge installation containing files from a previous successful build, alongside a build that only partially succeeded and overwrote some but not all files from before. This also remvoes just a little bit of unnecessary chattiness from the build output. --- docker/scripts/build-and-test.sh | 4 ---- pbuild.sh | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docker/scripts/build-and-test.sh b/docker/scripts/build-and-test.sh index 67572653..f8a3e5e6 100755 --- a/docker/scripts/build-and-test.sh +++ b/docker/scripts/build-and-test.sh @@ -10,12 +10,8 @@ sudo mkdir -p /usr/lib/lfmerge/${DbVersion} echo Running as $(id) # Assuming script is being run from inside the repo, find the repo root and use that as the working directory from now on -echo "Script dir is ${SCRIPT_DIR}" -ls -ld "${SCRIPT_DIR}" cd "${SCRIPT_DIR}" REPO_ROOT="$(git rev-parse --show-toplevel)" -echo "Repo root is ${REPO_ROOT}" -ls -ld "${REPO_ROOT}" cd "${REPO_ROOT}" echo "Building packages for version ${DebPackageVersion}" diff --git a/pbuild.sh b/pbuild.sh index 7884756c..19983576 100755 --- a/pbuild.sh +++ b/pbuild.sh @@ -58,6 +58,9 @@ done . docker/scripts/get-version-number.sh +# Clean out previous installation files if they exist +[ -d tarball ] && rm -rf tarball + # Run the build for DbVersion in ${DBMODEL_VERSIONS[@]}; do docker run -it \ From 5e8f346ca58cc2e223fb482864ba3e1c3ea38970 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 15:06:14 +0700 Subject: [PATCH 27/30] Update README with new build instructions --- README.md | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a504fd93..ed3764b2 100644 --- a/README.md +++ b/README.md @@ -14,21 +14,34 @@ You'll need Docker installed, as well as GNU Parallel to use the parallel-build ## Development -First, a word about the branching scheme of this repository and how it relates to FieldWorks. LfMerge supports FieldWorks versions 8.2 and later. FieldWorks has had different data models, represented by a six-digit integer called DbVersion. The data models for FieldWorks 8.x had DbVersions 7000068 through 7000070. DbVersion 7000071 was never released in anything but alpha builds of FieldWorks, and LfMerge does not support it. FieldWorks 9.0 and above uses DbVersion 7000072. +The `master` branch in this repository is where most development happens (it would be called `develop` if we were strictly following a Git-Flow naming scheme). The `live` branch is what release images are built from. Pushing to the `live` branch will build the Docker image, then if the build succeeds, it will tag the built commit with the version number with a `v` prefix (e.g., `v2.0.123`) and tag the Docker image with the unprefixed version number (e.g., `lfmerge:2.0.123`). -There are two main branches in the LfMerge repo, `master` and `fieldworks8-master`. That's because key parts of the FieldWorks API changed between FW 8 and FW 9, such as FDO (FieldWorks Data Objects) being renamed to LCM (Language and Culture Model) and large parts of the FDO API being moved to a library called liblcm. The process of acquiring FieldWorks DLLs also changed between FW 8 and FW 9. FW 8 DLLs (and other libraries that work with FW 8, such as Chorus) were never packaged as NuGet packages, so we have to download those DLLs as build artifacts from various TeamCity builds. FW 9 and its supporting libraries, however, are available as NuGet packages. So the build process for `master` and `fieldworks8-master` is slightly different. More on that in the Building section below. +The `live` branch is expected to be **fast-forwarded**, with no merge commits, from the `master` branch. When you want to push a new release, please do: -In addition to `master` and `fieldworks8-master`, there are also `qa` and `fieldworks8-qa` branches, and `live` and `fieldworks8-live` branches. The two `live` branches are the ones that the release is built from, while the `qa` branch is for prerelease builds. One consequence of this is that **most pull requests need to be doubled up**. When you create a feature branch called `feature/foo` and make a PR from it (against `master`), you'll need to make a similar feature branch and call it `feature/foo-fw8`, then create another PR from that branch against `fieldworks8-master`. Once someone has reviewed the PR against `master`, you can merge **both** PRs unless the reviewer specifically says not to. +1. `git checkout master` +1. `git pull --ff-only` to make sure you have the latest merged PRs +1. Deal with any merge conflicts, then run `git pull --ff-only` again if there were any conflicts +1. Once there are no merge conflicts, `git checkout live` +1. `git merge --ff-only master` +1. If no merge conflicts, `git push live` ## Building -For each DbVersion that LfMerge supports, we build a different lfmerge binary. DbVersions 7000068 through 7000070 are built from FW 8 branches (`fieldworks8-master` or `feature/foo-fw8`), while DbVersion 7000072 is built from an FW 9 branch (`master` or `feature/foo`). There is a script called `pbuild.sh` (for "parallel build") that will handle all the complexity of the build process for you. It will run the build for each DbVersion in a Docker container, using a common Docker build image, and then copy the final results into a directory called `tarball`. Finally, it will run a Docker build that will take the files in the `tarball` directory and turn then into a Docker image for `lfmerge`. By default, this Docker image will be tagged `ghcr.io/sillsdev/lfmerge:latest`, the same tag as the tag built by the GitHub Actions workflow. - -**Normally you will run `pbuild.sh` with no parameters.** It will look at the Git branch you have checked out, determine whether that branch is a branch based on FieldWorks 9 (DbVersion 7000072 or later) or FieldWorks 8 (DbVersions 7000068 through 7000070), and calculate the corresponding branch in the other FW version. E.g., if you're on `master` the corresponding branch will be `fieldworks8-master`. If you want different behavior, for example you want to run a build from `feature/foo` but use `fieldworks8-master` as the FW8 branch instead of `feature/foo-fw8`, then you can pass a parameter to `pbbuild.sh` to set what the corresponding branch should be. E.g. with `feature/foo` checked out, run `pbuild.sh fieldworks8-master` and you'll get a build where the DbVersion 7000072 binaries were built from the `feature/foo` branch, but where the DbVersion 7000068-7000070 binaries were built from `fieldworks8-master`. **You should rarely need this**, but it's sometimes helpful when you're trying to track down a bug that appears only in the FW 8 builds but not the FW 9 build, or vice-versa. +For each DbVersion that LfMerge supports, we build a different lfmerge binary. We used to support DbVersions 7000068 through 7000070, which correspond to various versions of FieldWorks 8.x, but we now only support FieldWorks 9.x. The only DbVersion found in FieldWorks 9.x is currently (as of August 2022) 7000072. There is a script called `pbuild.sh` (for "parallel build") that will handle building all currently-supported DbVersions. It will run the build for each DbVersion in a Docker container, using a common Docker build image, and then copy the final results into a directory called `tarball`. Finally, it will run a Docker build that will take the files in the `tarball` directory and turn then into a Docker image for `lfmerge`. By default, this Docker image will be tagged `ghcr.io/sillsdev/lfmerge:latest`, while the GitHub Actions workflow will produce a specific version number tag as well as `latest`, i.e. the GHA workflow will tag `lfmerge:2.0.123` as well as `lfmerge:latest`. ## Testing locally -The image that `pbuild.sh` produces is tagged with the same image tag as the one built by the official GitHub Actions workflow. This means that if you're running Language Forge locally via the Makefile in Language Forge's `docker` directory, you should be able to simply run `make` and the `lfmerge` container will be re-created with your local build. You can then do a Send/Receive via your `localhost` copy of Language Forge and check the results. +The image that `pbuild.sh` produces is tagged with the same image tag as the one built by the official GitHub Actions workflow, but with a `latest` tag instead of a versino number. This means that if you're running Language Forge locally via the Makefile in Language Forge's `docker` directory, you should be able to simply edit the `docker/lfmerge/Dockerfile` in Language Forge. Make sure that file specifies `lfmerge:latest` rather than `lfmerge:20..123`. Then run `make` and the `lfmerge` container will be re-created with your local build. You can then do a Send/Receive via your `localhost` copy of Language Forge and check the results. + +## Debugging unit tests in VS Code + +Debugging unit tests in VS Code is a two-step process. First, choose the "Run Test Task" command in VS Code. This task is configured to start the `dotnet test` process in debug mode, which means that it will set itself up (building the project if necessary), then pause itself waiting for a debugger to attach. Once it has paused itself, go to the debug tab (Crtl+Shift+D) and choose the "Attach" configuration. When prompted, enter the PID printed on the test console. (There will be two, one for LfMerge.Tests and one for LfMerge.Core.Tests; most of the tests are in LfMerge.Core so that's the one you'll need most of the time). The debugger will attach to the test process, which is still in a paused state. Set any breakpoints you want to hit in the unit tests, then unpause the debugger and it will start running the unit tests. + +To run specific unit tests instead of the whole suite, edit the `.vscode/tasks.json` file and change the launch args from `[ "test" ]` to something containing a filter, e.g. + +`[ "test", "--filter", "FullyQualifiedName~GetCustomFieldForThisCmObject" ],` + +The `~` in `FullyQualifiedName~` means "contains". For more possible filters you could use, see https://aka.ms/vstest-filtering ## Logs From 8bc4e8c68ec7190232aadf1709560fa678c81590 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 15:20:33 +0700 Subject: [PATCH 28/30] Remove unused lines from LfMerge.sln We no longer need the lines about LfMerge.proj or the ones about build configurations for DbVersions 68, 69, or 70. --- LfMerge.sln | 53 ----------------------------------------------------- 1 file changed, 53 deletions(-) diff --git a/LfMerge.sln b/LfMerge.sln index e7d87188..1d8dbc4e 100644 --- a/LfMerge.sln +++ b/LfMerge.sln @@ -6,8 +6,6 @@ MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4D9087DE-A03C-4B46-AE3A-CEB3F5A5D146}" ProjectSection(SolutionItems) = preProject environ = environ - build\LfMerge.proj = build\LfMerge.proj - build\NuGet.targets = build\NuGet.targets README.md = README.md CHANGELOG.md = CHANGELOG.md EndProjectSection @@ -31,105 +29,54 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Debug7000068|Any CPU = Debug7000068|Any CPU - Debug7000069|Any CPU = Debug7000069|Any CPU - Debug7000070|Any CPU = Debug7000070|Any CPU Debug7000072|Any CPU = Debug7000072|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug7000068|Any CPU.ActiveCfg = Debug|Any CPU - {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug7000068|Any CPU.Build.0 = Debug|Any CPU - {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug7000069|Any CPU.ActiveCfg = Debug|Any CPU - {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug7000069|Any CPU.Build.0 = Debug|Any CPU - {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug7000070|Any CPU.ActiveCfg = Debug|Any CPU - {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug7000070|Any CPU.Build.0 = Debug|Any CPU {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug7000072|Any CPU.ActiveCfg = Debug|Any CPU {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Debug7000072|Any CPU.Build.0 = Debug|Any CPU {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Release|Any CPU.ActiveCfg = Release|Any CPU {0E79BC8D-9AE4-4B2C-ACFB-D8C1B2BC3D4F}.Release|Any CPU.Build.0 = Release|Any CPU {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug7000068|Any CPU.ActiveCfg = Debug|Any CPU - {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug7000068|Any CPU.Build.0 = Debug|Any CPU - {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug7000069|Any CPU.ActiveCfg = Debug|Any CPU - {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug7000069|Any CPU.Build.0 = Debug|Any CPU - {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug7000070|Any CPU.ActiveCfg = Debug|Any CPU - {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug7000070|Any CPU.Build.0 = Debug|Any CPU {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug7000072|Any CPU.ActiveCfg = Debug|Any CPU {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Debug7000072|Any CPU.Build.0 = Debug|Any CPU {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Release|Any CPU.ActiveCfg = Release|Any CPU {B514E195-C83F-4CC9-A9BF-7F5A31952AAF}.Release|Any CPU.Build.0 = Release|Any CPU {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug7000068|Any CPU.ActiveCfg = Debug|Any CPU - {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug7000068|Any CPU.Build.0 = Debug|Any CPU - {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug7000069|Any CPU.ActiveCfg = Debug|Any CPU - {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug7000069|Any CPU.Build.0 = Debug|Any CPU - {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug7000070|Any CPU.ActiveCfg = Debug|Any CPU - {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug7000070|Any CPU.Build.0 = Debug|Any CPU {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug7000072|Any CPU.ActiveCfg = Debug|Any CPU {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Debug7000072|Any CPU.Build.0 = Debug|Any CPU {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Release|Any CPU.ActiveCfg = Release|Any CPU {FF82CEC0-353A-4E79-AB7E-6AFEF1F15EC2}.Release|Any CPU.Build.0 = Release|Any CPU {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug7000068|Any CPU.ActiveCfg = Debug|Any CPU - {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug7000068|Any CPU.Build.0 = Debug|Any CPU - {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug7000069|Any CPU.ActiveCfg = Debug|Any CPU - {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug7000069|Any CPU.Build.0 = Debug|Any CPU - {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug7000070|Any CPU.ActiveCfg = Debug|Any CPU - {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug7000070|Any CPU.Build.0 = Debug|Any CPU {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug7000072|Any CPU.ActiveCfg = Debug|Any CPU {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Debug7000072|Any CPU.Build.0 = Debug|Any CPU {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Release|Any CPU.ActiveCfg = Release|Any CPU {AFD8D8A6-2D98-482F-B367-6C0268B61154}.Release|Any CPU.Build.0 = Release|Any CPU {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug7000068|Any CPU.ActiveCfg = Debug|Any CPU - {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug7000068|Any CPU.Build.0 = Debug|Any CPU - {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug7000069|Any CPU.ActiveCfg = Debug|Any CPU - {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug7000069|Any CPU.Build.0 = Debug|Any CPU - {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug7000070|Any CPU.ActiveCfg = Debug|Any CPU - {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug7000070|Any CPU.Build.0 = Debug|Any CPU {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug7000072|Any CPU.ActiveCfg = Debug|Any CPU {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Debug7000072|Any CPU.Build.0 = Debug|Any CPU {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Release|Any CPU.ActiveCfg = Release|Any CPU {40EC1EB4-F1EA-4FD7-9A4E-1ACA5BA31FC3}.Release|Any CPU.Build.0 = Release|Any CPU {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug7000068|Any CPU.ActiveCfg = Debug|Any CPU - {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug7000068|Any CPU.Build.0 = Debug|Any CPU - {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug7000069|Any CPU.ActiveCfg = Debug|Any CPU - {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug7000069|Any CPU.Build.0 = Debug|Any CPU - {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug7000070|Any CPU.ActiveCfg = Debug|Any CPU - {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug7000070|Any CPU.Build.0 = Debug|Any CPU {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug7000072|Any CPU.ActiveCfg = Debug|Any CPU {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Debug7000072|Any CPU.Build.0 = Debug|Any CPU {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Release|Any CPU.ActiveCfg = Release|Any CPU {DED60A67-66FC-44DD-8AD5-67E470D74A53}.Release|Any CPU.Build.0 = Release|Any CPU {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug7000068|Any CPU.ActiveCfg = Debug|Any CPU - {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug7000068|Any CPU.Build.0 = Debug|Any CPU - {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug7000069|Any CPU.ActiveCfg = Debug|Any CPU - {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug7000069|Any CPU.Build.0 = Debug|Any CPU - {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug7000070|Any CPU.ActiveCfg = Debug|Any CPU - {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug7000070|Any CPU.Build.0 = Debug|Any CPU {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug7000072|Any CPU.ActiveCfg = Debug|Any CPU {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Debug7000072|Any CPU.Build.0 = Debug|Any CPU {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Release|Any CPU.ActiveCfg = Release|Any CPU {3152A333-A741-4EE7-A791-DFE0E4C5E2AA}.Release|Any CPU.Build.0 = Release|Any CPU {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug7000068|Any CPU.ActiveCfg = Debug|Any CPU - {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug7000068|Any CPU.Build.0 = Debug|Any CPU - {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug7000069|Any CPU.ActiveCfg = Debug|Any CPU - {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug7000069|Any CPU.Build.0 = Debug|Any CPU - {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug7000070|Any CPU.ActiveCfg = Debug|Any CPU - {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug7000070|Any CPU.Build.0 = Debug|Any CPU {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug7000072|Any CPU.ActiveCfg = Debug|Any CPU {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Debug7000072|Any CPU.Build.0 = Debug|Any CPU {28882F30-358B-4E1C-A934-076D9EE6ACFC}.Release|Any CPU.ActiveCfg = Release|Any CPU From d6bbedc397f8c29800565ef8bd9d9a534184c699 Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 15:22:44 +0700 Subject: [PATCH 29/30] Delete MonoDevelopProperties from LfMerge.sln We're never going to use MonoDevelop in the future, as VS Code is so much better. So the whole MonoDevelopProperties section in the .sln file is a waste of space and processing time. Let's dump the whole thing. --- LfMerge.sln | 190 ---------------------------------------------------- 1 file changed, 190 deletions(-) diff --git a/LfMerge.sln b/LfMerge.sln index 1d8dbc4e..090e3358 100644 --- a/LfMerge.sln +++ b/LfMerge.sln @@ -88,194 +88,4 @@ Global GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {34938BD0-DBBC-4C1A-B02A-2571C0783AD5} EndGlobalSection - GlobalSection(MonoDevelopProperties) = preSolution - Policies = $0 - $0.StandardHeader = $1 - $1.Text = @Copyright (c) ${Year} SIL International\nThis software is licensed under the MIT license (http://opensource.org/licenses/MIT) - $1.IncludeInNewFiles = True - $0.TextStylePolicy = $8 - $2.inheritsSet = null - $2.scope = text/x-csharp - $0.CSharpFormattingPolicy = $3 - $3.PropertyBraceStyle = NextLine - $3.PropertyGetBraceStyle = NextLine - $3.PropertySetBraceStyle = NextLine - $3.EventBraceStyle = NextLine - $3.EventAddBraceStyle = NextLine - $3.EventRemoveBraceStyle = NextLine - $3.StatementBraceStyle = NextLine - $3.ElseNewLinePlacement = NewLine - $3.CatchNewLinePlacement = NewLine - $3.FinallyNewLinePlacement = NewLine - $3.BeforeMethodDeclarationParentheses = False - $3.BeforeMethodCallParentheses = False - $3.BeforeConstructorDeclarationParentheses = False - $3.BeforeIndexerDeclarationBracket = False - $3.BeforeDelegateDeclarationParentheses = False - $3.AfterDelegateDeclarationParameterComma = True - $3.NewParentheses = False - $3.SpacesBeforeBrackets = False - $3.AlignToFirstMethodDeclarationParameter = False - $3.AlignToFirstIndexerDeclarationParameter = False - $3.inheritsSet = Mono - $3.inheritsScope = text/x-csharp - $3.scope = text/x-csharp - $0.DotNetNamingPolicy = $4 - $4.DirectoryNamespaceAssociation = PrefixedHierarchical - $4.ResourceNamePolicy = FileName - $5.FileWidth = 98 - $5.TabsToSpaces = False - $5.inheritsSet = VisualStudio - $5.inheritsScope = text/plain - $5.scope = text/plain - $6.inheritsSet = null - $6.scope = application/config+xml - $0.XmlFormattingPolicy = $9 - $7.inheritsSet = null - $7.scope = application/config+xml - $8.inheritsSet = null - $8.scope = application/xml - $9.inheritsSet = Mono - $9.inheritsScope = application/xml - $9.scope = application/xml - $0.NameConventionPolicy = $10 - $10.Rules = $11 - $11.NamingRule = $38 - $12.Name = Namespaces - $12.AffectedEntity = Namespace - $12.VisibilityMask = VisibilityMask - $12.NamingStyle = PascalCase - $12.IncludeInstanceMembers = True - $12.IncludeStaticEntities = True - $13.Name = Types - $13.AffectedEntity = Class, Struct, Enum, Delegate - $13.VisibilityMask = VisibilityMask - $13.NamingStyle = PascalCase - $13.IncludeInstanceMembers = True - $13.IncludeStaticEntities = True - $14.Name = Interfaces - $14.RequiredPrefixes = $15 - $15.String = I - $14.AffectedEntity = Interface - $14.VisibilityMask = VisibilityMask - $14.NamingStyle = PascalCase - $14.IncludeInstanceMembers = True - $14.IncludeStaticEntities = True - $16.Name = Attributes - $16.RequiredSuffixes = $17 - $17.String = Attribute - $16.AffectedEntity = CustomAttributes - $16.VisibilityMask = VisibilityMask - $16.NamingStyle = PascalCase - $16.IncludeInstanceMembers = True - $16.IncludeStaticEntities = True - $18.Name = Event Arguments - $18.RequiredSuffixes = $19 - $19.String = EventArgs - $18.AffectedEntity = CustomEventArgs - $18.VisibilityMask = VisibilityMask - $18.NamingStyle = PascalCase - $18.IncludeInstanceMembers = True - $18.IncludeStaticEntities = True - $20.Name = Exceptions - $20.RequiredSuffixes = $21 - $21.String = Exception - $20.AffectedEntity = CustomExceptions - $20.VisibilityMask = VisibilityMask - $20.NamingStyle = PascalCase - $20.IncludeInstanceMembers = True - $20.IncludeStaticEntities = True - $22.Name = Methods - $22.AffectedEntity = Methods - $22.VisibilityMask = VisibilityMask - $22.NamingStyle = PascalCase - $22.IncludeInstanceMembers = True - $22.IncludeStaticEntities = True - $23.Name = Static Readonly Fields - $23.AffectedEntity = ReadonlyField - $23.VisibilityMask = Internal, Protected, Public - $23.NamingStyle = PascalCase - $23.IncludeInstanceMembers = False - $23.IncludeStaticEntities = True - $24.Name = Fields (Non Private) - $24.AffectedEntity = Field - $24.VisibilityMask = Internal, Protected, Public - $24.NamingStyle = PascalCase - $24.IncludeInstanceMembers = True - $24.IncludeStaticEntities = True - $25.Name = ReadOnly Fields (Non Private) - $25.AffectedEntity = ReadonlyField - $25.VisibilityMask = Internal, Protected, Public - $25.NamingStyle = PascalCase - $25.IncludeInstanceMembers = True - $25.IncludeStaticEntities = False - $26.Name = Fields (Private) - $26.RequiredPrefixes = $27 - $27.String = _ - $26.AffectedEntity = Field, ReadonlyField - $26.VisibilityMask = Private - $26.NamingStyle = CamelCase - $26.IncludeInstanceMembers = True - $26.IncludeStaticEntities = False - $28.Name = Static Fields (Private) - $28.AffectedEntity = Field - $28.VisibilityMask = Private - $28.NamingStyle = CamelCase - $28.IncludeInstanceMembers = False - $28.IncludeStaticEntities = True - $29.Name = ReadOnly Fields (Private) - $29.RequiredPrefixes = $30 - $30.String = _ - $29.AffectedEntity = ReadonlyField - $29.VisibilityMask = Private - $29.NamingStyle = CamelCase - $29.IncludeInstanceMembers = True - $29.IncludeStaticEntities = False - $31.Name = Constant Fields - $31.AffectedEntity = ConstantField - $31.VisibilityMask = VisibilityMask - $31.NamingStyle = PascalCase - $31.IncludeInstanceMembers = True - $31.IncludeStaticEntities = True - $32.Name = Properties - $32.AffectedEntity = Property - $32.VisibilityMask = VisibilityMask - $32.NamingStyle = PascalCase - $32.IncludeInstanceMembers = True - $32.IncludeStaticEntities = True - $33.Name = Events - $33.AffectedEntity = Event - $33.VisibilityMask = VisibilityMask - $33.NamingStyle = PascalCase - $33.IncludeInstanceMembers = True - $33.IncludeStaticEntities = True - $34.Name = Enum Members - $34.AffectedEntity = EnumMember - $34.VisibilityMask = VisibilityMask - $34.NamingStyle = PascalCase - $34.IncludeInstanceMembers = True - $34.IncludeStaticEntities = True - $35.Name = Parameters - $35.AffectedEntity = Parameter - $35.VisibilityMask = VisibilityMask - $35.NamingStyle = CamelCase - $35.IncludeInstanceMembers = True - $35.IncludeStaticEntities = True - $36.Name = Type Parameters - $36.RequiredPrefixes = $37 - $37.String = T - $36.AffectedEntity = TypeParameter - $36.VisibilityMask = VisibilityMask - $36.NamingStyle = PascalCase - $36.IncludeInstanceMembers = True - $36.IncludeStaticEntities = True - $38.Name = Fields (Private) - $38.RequiredPrefixes = $39 - $39.String = _ - $38.AffectedEntity = None - $38.VisibilityMask = Private - $38.NamingStyle = PascalCase - $38.IncludeInstanceMembers = True - $38.IncludeStaticEntities = False - EndGlobalSection EndGlobal From ece4e67171a0b1ff4549f1330bb0cd06b976454f Mon Sep 17 00:00:00 2001 From: Robin Munn Date: Fri, 19 Aug 2022 15:41:27 +0700 Subject: [PATCH 30/30] Remove unneeded test filter in .vscode/tasks.json Co-authored-by: Christopher Hirt --- .vscode/tasks.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 10eccd27..90df8e9d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -25,7 +25,7 @@ "type": "process", "isBackground": true, "command": "dotnet", - "args": [ "test", "--filter", "FullyQualifiedName=LfMerge.Core.Tests.Lcm.DataConverters.ConvertLcmToMongoCustomFieldTests.GetCustomFieldForThisCmObject_ShouldGetMultiListRef" ], + "args": [ "test" ], "options": { "cwd": "${workspaceFolder}",