diff --git a/.github/workflows/sync-version-branches.yml b/.github/workflows/sync-version-branches.yml index 0a1a9a31..a17a0c41 100644 --- a/.github/workflows/sync-version-branches.yml +++ b/.github/workflows/sync-version-branches.yml @@ -4,8 +4,6 @@ on: push: branches: - main - - net8 # Allows manual pushes to net8 to be visible, but sync logic only runs from main - - net9 # Allows manual pushes to net9 to be visible, but sync logic only runs from main workflow_dispatch: inputs: target_branches: @@ -24,11 +22,10 @@ jobs: runs-on: ubuntu-latest permissions: - contents: write # Required to push commits to the repository - pull-requests: write # Required to create pull requests - issues: write # Required to create and manage labels + contents: write + pull-requests: write + issues: write - # Only run sync logic when triggered from main branch (prevents infinite loops) if: github.ref == 'refs/heads/main' strategy: @@ -40,14 +37,9 @@ jobs: - name: Check PAT_TOKEN exists run: | if [ -z "${{ secrets.PAT_TOKEN }}" ]; then - echo "❌ ERROR: PAT_TOKEN secret is not configured!" - echo "Please add a Personal Access Token with 'repo' scope to repository secrets." - echo "Go to: Settings → Secrets and variables → Actions → New repository secret" - echo "Name: PAT_TOKEN" - echo "Value: Your GitHub Personal Access Token" + echo "::error::PAT_TOKEN secret is not configured" exit 1 fi - echo "✅ PAT_TOKEN is configured" - name: Checkout repository uses: actions/checkout@v4 @@ -60,301 +52,253 @@ jobs: run: | git config --global user.name "github-actions[bot]" git config --global user.email "github-actions[bot]@users.noreply.github.com" - - # Configure git to use the PAT for authentication git config --global url."https://${{ secrets.PAT_TOKEN }}@github.com/".insteadOf "https://github.com/" - - name: Extract target branches from input - if: github.event_name == 'workflow_dispatch' + - name: Check if sync is needed + id: check run: | - if [ -n "${{ github.event.inputs.target_branches }}" ]; then - echo "TARGET_BRANCHES=[$(echo '${{ github.event.inputs.target_branches }}' | sed 's/,/","/g' | sed 's/^/"/;s/$/"/')]" >> $GITHUB_ENV - fi - - - name: Check if merge is needed - id: check_merge - run: | - echo "🔍 Checking if merge is needed for ${{ matrix.target_branch }}" - - # Check if target branch exists if ! git ls-remote --heads origin ${{ matrix.target_branch }} | grep -q ${{ matrix.target_branch }}; then - echo "branch_exists=false" >> $GITHUB_OUTPUT - echo "❌ Target branch ${{ matrix.target_branch }} does not exist" + echo "needs_sync=false" >> $GITHUB_OUTPUT + echo "::warning::Target branch ${{ matrix.target_branch }} does not exist" exit 0 fi - # Check if main has new commits git checkout main git checkout ${{ matrix.target_branch }} if git merge-base --is-ancestor main ${{ matrix.target_branch }}; then - echo "needs_merge=false" >> $GITHUB_OUTPUT - echo "ℹ️ No new commits to merge" + echo "needs_sync=false" >> $GITHUB_OUTPUT + echo "No new commits to sync" else - echo "needs_merge=true" >> $GITHUB_OUTPUT - echo "✅ New commits found, merge needed" + echo "needs_sync=true" >> $GITHUB_OUTPUT + echo "New commits found, sync needed" fi - - name: Create sync branch and apply changes - if: steps.check_merge.outputs.needs_merge == 'true' + - name: Sync changes + if: steps.check.outputs.needs_sync == 'true' + id: sync run: | - echo "🔄 Creating sync branch from ${{ matrix.target_branch }}" - - # Create a new branch for the PR - sync_branch="sync-main-to-${{ matrix.target_branch }}-$(date +%Y%m%d-%H%M%S)" - git checkout -b "$sync_branch" ${{ matrix.target_branch }} - - # Get only commits from the current push event (not all commits between branches) - # Use the push event data to get commits from this specific push - echo "📍 Getting commits from current push event..." - - # Get commits from the push event - if [ "${{ github.event_name }}" = "push" ] && [ -n "${{ github.event.before }}" ] && [ -n "${{ github.event.after }}" ]; then - # Push event: get commits between before and after - echo "📋 Getting commits from push: ${{ github.event.before }}..${{ github.event.after }}" - git log "${{ github.event.before }}..${{ github.event.after }}" --format="%H" --reverse > /tmp/commits_to_apply.txt - elif [ "${{ github.event_name }}" = "push" ] && [ -n "${{ github.event.head_commit.id }}" ]; then - # Fallback: use head commit if before/after not available - echo "📋 Using head commit: ${{ github.event.head_commit.id }}" - echo "${{ github.event.head_commit.id }}" > /tmp/commits_to_apply.txt - elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - # Manual dispatch: get commits since last sync (merge base to main) - echo "📋 Workflow dispatch: getting commits since last sync" - merge_base=$(git merge-base ${{ matrix.target_branch }} main) - git log "$merge_base..main" --format="%H" --reverse > /tmp/commits_to_apply.txt + set -euo pipefail + + TARGET="${{ matrix.target_branch }}" + DOTNET_VER=$(echo "$TARGET" | sed 's/[^0-9]*//g') + + # Create sync branch + sync_branch="sync-main-to-${TARGET}-$(date +%Y%m%d-%H%M%S)" + git checkout -b "$sync_branch" "$TARGET" + + # ── Load .sync-exclude list ── + # These files have version-specific implementations and must stay as-is on the target branch + EXCLUDE_FILES=() + if [ -f ".sync-exclude" ]; then + while IFS= read -r line; do + line=$(echo "$line" | sed 's/#.*//' | xargs) + [ -n "$line" ] && EXCLUDE_FILES+=("$line") + done < .sync-exclude + echo "📋 Loaded ${#EXCLUDE_FILES[@]} files from .sync-exclude" + fi + + # ── Determine commits to cherry-pick ── + if [ "${{ github.event_name }}" = "push" ] && [ "${{ github.event.before }}" != "0000000000000000000000000000000000000000" ]; then + git log "${{ github.event.before }}..${{ github.event.after }}" --format="%H" --reverse > /tmp/commits.txt else - # Fallback: get commits since merge base - echo "📋 Fallback: getting commits since merge base" - merge_base=$(git merge-base ${{ matrix.target_branch }} main) - git log "$merge_base..main" --format="%H" --reverse > /tmp/commits_to_apply.txt + merge_base=$(git merge-base "$TARGET" main) + git log "$merge_base..main" --format="%H" --reverse > /tmp/commits.txt fi - - # If no commits found, try alternative method - if [ ! -s /tmp/commits_to_apply.txt ]; then - echo "⚠️ No commits found with primary method, trying alternative..." - merge_base=$(git merge-base ${{ matrix.target_branch }} main) - git log "$merge_base..main" --format="%H" --reverse > /tmp/commits_to_apply.txt + + if [ ! -s /tmp/commits.txt ]; then + echo "No commits found" + exit 0 fi - if [ -s /tmp/commits_to_apply.txt ]; then - echo "📋 Found commits to apply:" - while read commit; do - commit_msg=$(git log -1 --format="%s" "$commit") - echo " - $commit: $commit_msg" - done < /tmp/commits_to_apply.txt - - # Filter out commits that are already in the target branch - echo "🔍 Filtering out commits already in ${{ matrix.target_branch }} branch..." - filtered_commits_file="/tmp/filtered_commits.txt" - touch "$filtered_commits_file" - - successful_count=0 - failed_count=0 - already_applied_count=0 - - # Use git cherry to find commits that are already in target branch (compares patches, not just hashes) - # This detects commits even if they were cherry-picked with different hashes - # git cherry upstream head: compares 'head' against 'upstream' - # - means commit in 'head' is equivalent to one in 'upstream' (already applied) - # + means commit in 'head' is not in 'upstream' (needs to be applied) - echo "🔍 Checking which commits are already applied (using patch comparison)..." - - # Ensure we have the latest state of both branches - git fetch origin ${{ matrix.target_branch }}:refs/remotes/origin/${{ matrix.target_branch }} 2>/dev/null || true - git fetch origin main:refs/remotes/origin/main 2>/dev/null || true - - # Get cherry output - this shows commits in 'main' compared to 'target_branch' - # Lines starting with '-' mean the commit in main is equivalent to one already in target_branch - cherry_output=$(git cherry ${{ matrix.target_branch }} main 2>/dev/null || echo "") - - # Create a set of commits that are already in target branch (lines starting with '-') - declare -A already_applied_commits=() - if [ -n "$cherry_output" ]; then - echo "📊 Git cherry found $(echo "$cherry_output" | wc -l) commits to check" - while IFS= read -r line; do - if [[ $line =~ ^- ]]; then - # Extract commit hash (second field after the '-' and space) - commit_hash=$(echo "$line" | awk '{print $2}') - if [ -n "$commit_hash" ]; then - already_applied_commits["$commit_hash"]=1 - echo " ✓ Commit $commit_hash already applied (patch equivalent)" - fi - fi - done <<< "$cherry_output" - echo "📊 Found ${#already_applied_commits[@]} commits already applied via patch comparison" + # ── Filter already-applied commits using git cherry ── + echo "🔍 Filtering already-applied commits..." + declare -A applied=() + cherry_output=$(git cherry "$TARGET" main 2>/dev/null || echo "") + if [ -n "$cherry_output" ]; then + while IFS= read -r line; do + if [[ $line == -* ]]; then + hash=$(echo "$line" | awk '{print $2}') + [ -n "$hash" ] && applied["$hash"]=1 + fi + done <<< "$cherry_output" + fi + + # ── Cherry-pick commits ── + successful=0 + skipped=0 + failed_commits="" + excluded_file_changes="" + + while read -r commit; do + msg=$(git log -1 --format="%s" "$commit" 2>/dev/null || echo "unknown") + + # Skip if already applied (exact hash or patch match) + if git branch --contains "$commit" 2>/dev/null | grep -q "$TARGET"; then + echo "⏭️ Already in branch (exact): $msg" + skipped=$((skipped + 1)) + continue fi - - # Cherry-pick each commit individually, but first check if it's already in target branch - # Only use git-based detection, no commit message checks - while read commit; do - commit_msg=$(git log -1 --format="%s" "$commit" 2>/dev/null || echo "unknown") - - # Check if commit is already in target branch (by exact hash) - if git branch --contains "$commit" | grep -q "${{ matrix.target_branch }}"; then - echo "⏭️ Commit $commit already in ${{ matrix.target_branch }} (exact match), skipping" - already_applied_count=$((already_applied_count + 1)) - continue + if [[ -n "${applied[$commit]:-}" ]]; then + echo "⏭️ Already in branch (patch): $msg" + skipped=$((skipped + 1)) + continue + fi + + # Check if this commit touches any excluded files + commit_files=$(git diff-tree --no-commit-id --name-only -r "$commit" 2>/dev/null || true) + for excl in "${EXCLUDE_FILES[@]}"; do + if echo "$commit_files" | grep -qF "$excl"; then + excluded_file_changes="${excluded_file_changes}\n- \`${commit:0:8}\` ($msg) modified \`$excl\`" fi - - # Check if commit is already applied (by patch comparison using git cherry) - # This detects commits even if they were cherry-picked with different hashes - if [[ -n "${already_applied_commits[$commit]}" ]]; then - echo "⏭️ Commit $commit already in ${{ matrix.target_branch }} (patch match), skipping" - already_applied_count=$((already_applied_count + 1)) - continue + done + + # Try cherry-pick + if git cherry-pick --no-commit "$commit" 2>/dev/null; then + if git diff --cached --quiet && git diff --quiet; then + echo "⏭️ Empty after apply: $msg" + git cherry-pick --abort 2>/dev/null || true + skipped=$((skipped + 1)) + else + echo "✅ Applied: $msg" + successful=$((successful + 1)) fi - - # Commit is new and not already applied, add to filtered list - echo "$commit" >> "$filtered_commits_file" - done < /tmp/commits_to_apply.txt - - # Now cherry-pick only the filtered commits - if [ -s "$filtered_commits_file" ]; then - echo "🍒 Processing commits (skipped ${already_applied_count} already in branch)..." - while read commit; do - commit_msg=$(git log -1 --format="%s" "$commit") - echo "🍒 Cherry-picking $commit: $commit_msg" - - # Try cherry-pick with conflict resolution - if git cherry-pick --no-commit "$commit" 2>&1; then - # Check if cherry-pick resulted in actual changes - if git diff --cached --quiet && git diff --quiet; then - # Empty commit, already applied - echo "ℹ️ Commit $commit already applied (no changes), skipping..." - git cherry-pick --abort || true - already_applied_count=$((already_applied_count + 1)) - else - echo "✅ Cherry-pick successful for $commit" - successful_count=$((successful_count + 1)) + else + # Conflict — accept incoming changes for non-excluded files, keep target for excluded + echo "⚠️ Conflict on: $msg — auto-resolving..." + + # Get list of conflicted files + conflicted_files=$(git diff --name-only --diff-filter=U 2>/dev/null || true) + resolved=true + + for file in $conflicted_files; do + is_excluded=false + for excl in "${EXCLUDE_FILES[@]}"; do + if [ "$file" = "$excl" ]; then + is_excluded=true + break fi + done + + if [ "$is_excluded" = true ]; then + # Keep target branch version for excluded files + git checkout "$TARGET" -- "$file" 2>/dev/null || true else - # Check if it's already applied (empty commit) - if git diff --cached --quiet && git diff --quiet; then - # Empty commit, already applied - echo "ℹ️ Commit $commit already applied (empty), skipping..." - git cherry-pick --abort || true - already_applied_count=$((already_applied_count + 1)) - else - # Has conflicts or other issues, skip this commit - echo "⚠️ Conflicts or issues with $commit, skipping..." - git cherry-pick --abort || true - failed_count=$((failed_count + 1)) - fi + # Accept incoming (main) version for everything else + git checkout --theirs -- "$file" 2>/dev/null || true fi - done < "$filtered_commits_file" - else - echo "ℹ️ No new commits to cherry-pick (all commits already in branch)" + git add "$file" 2>/dev/null || true + done + + if [ "$resolved" = true ] && ! git diff --cached --quiet; then + echo "✅ Resolved & applied: $msg" + successful=$((successful + 1)) + else + echo "❌ Could not resolve: $msg" + git cherry-pick --abort 2>/dev/null || true + failed_commits="${failed_commits}\n- ${commit:0:8}: $msg" + fi fi - - echo "📊 Summary: $successful_count successful cherry-picks, $failed_count failed, $already_applied_count already in branch" - else - # No commits found to apply - echo "ℹ️ No commits found to apply - branches may already be in sync" - git checkout main - git branch -D "$sync_branch" 2>/dev/null || true - exit 0 + done < /tmp/commits.txt + + echo "📊 Summary: $successful applied, $skipped skipped" + if [ -n "$failed_commits" ]; then + echo "❌ Failed commits:$failed_commits" fi - - # Reset files that should stay as they are in the target branch - # (This runs for both the if and else branches above) - echo "📝 Processing configuration files..." - - # Reset all .csproj files - find . -name "*.csproj" -type f -exec git checkout ${{ matrix.target_branch }} -- {} \; - - # Get Directory.Build.props from main and update it for target branch - # Main is now net10, so we convert 10.x.x → target version + + # ── Reset version-specific files ── + echo "📝 Resetting version-specific files..." + + # 1. Reset all .csproj files to target branch + find . -name "*.csproj" -type f -exec git checkout "$TARGET" -- {} \; 2>/dev/null || true + + # 2. Reset .sync-exclude files to target branch + for excl in "${EXCLUDE_FILES[@]}"; do + if git show "${TARGET}:${excl}" >/dev/null 2>&1; then + git checkout "$TARGET" -- "$excl" + echo " Reset excluded: $excl" + fi + done + + # 3. Update Directory.Build.props from main with correct version numbers if [ -f "src/Directory.Build.props" ]; then - echo "📝 Getting Directory.Build.props from main and updating for ${{ matrix.target_branch }}..." - - # Explicitly get the file from main branch git checkout main -- src/Directory.Build.props - - # Get the target .NET version - dotnet_version=$(echo "${{ matrix.target_branch }}" | sed 's/[^0-9]*//g') - - # Show current state from main - echo "Directory.Build.props from main (before update):" - grep -E "|" src/Directory.Build.props - - # Update version (10.x.x → target.x.x) keeping the same minor/patch/suffix - # Main is net10, so we convert from 10.x.x to the target version + + # Version: 10.x.x → {dotnet_ver}.x.x current_version=$(grep -oP '\K[^<]+' src/Directory.Build.props) - new_version=$(echo "$current_version" | sed "s/^10\./$dotnet_version./") + new_version=$(echo "$current_version" | sed "s/^10\./$DOTNET_VER./") sed -i "s|$current_version|$new_version|g" src/Directory.Build.props - - # Update target framework (net10.0 → net{target}.0) - sed -i "s|net10\.0|net$dotnet_version.0|g" src/Directory.Build.props - - echo "Directory.Build.props after update:" - grep -E "|" src/Directory.Build.props + + # TargetFramework: net10.0 → net{dotnet_ver}.0 + sed -i "s|net10\.0|net${DOTNET_VER}.0|g" src/Directory.Build.props + + # DotNetVersion: [10.0.0,11.0.0) → [{dotnet_ver}.0.0,{dotnet_ver+1}.0.0) + next_ver=$((DOTNET_VER + 1)) + sed -i "s|\[10\.0\.0,11\.0\.0)|[${DOTNET_VER}.0.0,${next_ver}.0.0)|g" src/Directory.Build.props + + echo " Updated Directory.Build.props: Version=$new_version, TF=net${DOTNET_VER}.0, DotNetVersion=[${DOTNET_VER}.0.0,${next_ver}.0.0)" fi - - # Reset workflow files to avoid including workflow changes in the PR - echo "📝 Resetting workflow files to ${{ matrix.target_branch }} version..." + + # 4. Reset workflow files to target branch if [ -d ".github/workflows" ]; then - git checkout ${{ matrix.target_branch }} -- .github/workflows/ || true + git checkout "$TARGET" -- .github/workflows/ 2>/dev/null || true fi - - # Stage all changes + # ── Stage and commit ── git add -A - - # Show what files have changes - echo "📋 Files with changes after cherry-pick and reset:" - git diff --cached --name-status - - # Show actual changes - echo "📝 Actual changes to be committed:" + + echo "📋 Files changed:" git diff --cached --stat - # Check if there are changes to commit if git diff --cached --quiet; then - echo "ℹ️ No changes to commit after processing" - echo "This means all changes from main are already in ${{ matrix.target_branch }}" - echo "or only affected .csproj/Directory.Build.props files which we reset." - git checkout main - git branch -D "$sync_branch" + echo "No changes to commit after processing" + exit 0 + fi + + if [ "${{ inputs.dry_run }}" = "true" ]; then + echo "🏃 Dry run — not committing" exit 0 fi - # Commit the changes - git commit -m "Sync changes from main to ${{ matrix.target_branch }} - Applied recent commits, updated versions & framework, preserved .csproj files" + # Build commit message with failed commits info + COMMIT_MSG="Sync changes from main to ${TARGET}" + if [ -n "$failed_commits" ]; then + COMMIT_MSG="${COMMIT_MSG} + + ⚠️ Commits that could not be applied (need manual review):$(echo -e "$failed_commits")" + fi + + git commit -m "$COMMIT_MSG" + + # Save excluded file changes for PR comment + if [ -n "$excluded_file_changes" ]; then + { + echo "excluded_file_changes<> $GITHUB_ENV + fi - echo "📤 Attempting to push sync branch: $sync_branch" - - # Try to push to origin, if it fails try to push to a fork + # ── Push ── if git push origin "$sync_branch" 2>/dev/null; then - echo "✅ Pushed to origin successfully" - PUSH_REPO="${{ github.repository }}" + echo "sync_branch=$sync_branch" >> $GITHUB_ENV + echo "push_repo=${{ github.repository }}" >> $GITHUB_ENV else - echo "⚠️ Cannot push to origin, trying fork approach..." - - # Check if we have a fork configured FORK_OWNER="${{ vars.FORK_OWNER || 'arcenox' }}" FORK_URL="https://${{ secrets.PAT_TOKEN }}@github.com/${FORK_OWNER}/TickerQ.git" - - # Add fork as remote if not exists git remote add fork "$FORK_URL" 2>/dev/null || git remote set-url fork "$FORK_URL" - - # Push to fork if git push fork "$sync_branch"; then - echo "✅ Pushed to fork: ${FORK_OWNER}/TickerQ" - PUSH_REPO="${FORK_OWNER}/TickerQ" + echo "sync_branch=$sync_branch" >> $GITHUB_ENV + echo "push_repo=${FORK_OWNER}/TickerQ" >> $GITHUB_ENV else - echo "❌ Failed to push to both origin and fork" + echo "::error::Failed to push to both origin and fork" exit 1 fi fi - # Store branch name and repo for PR creation - echo "sync_branch=$sync_branch" >> $GITHUB_ENV - echo "push_repo=$PUSH_REPO" >> $GITHUB_ENV - - name: Ensure labels exist - if: steps.check_merge.outputs.needs_merge == 'true' + if: steps.check.outputs.needs_sync == 'true' && env.sync_branch != '' run: | - # Create labels if they don't exist (ignore errors if they already exist) gh label create "automated" --description "Automated PR" --color "0E8A16" 2>/dev/null || true gh label create "sync" --description "Branch synchronization" --color "1D76DB" 2>/dev/null || true gh label create "${{ matrix.target_branch }}" --description "Target: ${{ matrix.target_branch }} branch" --color "FEF2C0" 2>/dev/null || true @@ -362,110 +306,77 @@ jobs: GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }} - name: Create Pull Request - if: steps.check_merge.outputs.needs_merge == 'true' && env.sync_branch != '' + if: steps.check.outputs.needs_sync == 'true' && env.sync_branch != '' run: | - # Get the target .NET version number for display dotnet_version=$(echo "${{ matrix.target_branch }}" | sed 's/[^0-9]*//g') - - # Create PR using GitHub CLI (gh) - PR_BODY=$(cat << EOF - ## 🤖 Automated Branch Sync - This PR syncs recent changes from \`main\` branch to \`${{ matrix.target_branch }}\`. + PR_BODY=$(cat << 'PREOF' + ## Automated Branch Sync - ### Changes Applied: - - ✅ Applied recent commits from main (using cherry-pick) - - ✅ Updated version numbers (10.x.x → ${dotnet_version}.x.x) - - ✅ Updated target framework (net10.0 → net${dotnet_version}.0) - - ✅ Preserved .csproj files from ${{ matrix.target_branch }} branch - - ⏭️ Commits already in target branch were automatically excluded + This PR syncs recent changes from `main` to `${{ matrix.target_branch }}`. - ### Review Notes: - - All .csproj files maintain ${{ matrix.target_branch }} configurations - - Directory.Build.props has been updated for ${{ matrix.target_branch }} compatibility - - Ready for testing on ${{ matrix.target_branch }} environment + ### What was done: + - Cherry-picked new commits from main + - Updated `Directory.Build.props` versions (10.x.x → ${dotnet_version}.x.x, DotNetVersion range) + - Preserved all `.csproj` files from ${{ matrix.target_branch }} + - Preserved version-specific files listed in `.sync-exclude` + - Skipped commits already in the target branch (patch-level dedup) + + ### Version-specific files (NOT synced): + Files in `.sync-exclude` have different implementations per .NET version and are kept as-is. --- _Created automatically by branch sync workflow_ - EOF + PREOF ) - # Create PR (from fork if necessary) if [ "${{ env.push_repo }}" = "${{ github.repository }}" ]; then - # Creating PR from same repo gh pr create \ --base "${{ matrix.target_branch }}" \ --head "${{ env.sync_branch }}" \ - --title "🔄 Sync main branch changes to ${{ matrix.target_branch }}" \ + --title "Sync main → ${{ matrix.target_branch }}" \ --body "$PR_BODY" \ 2>&1 | tee pr_output.txt else - # Creating PR from fork FORK_OWNER=$(echo "${{ env.push_repo }}" | cut -d'/' -f1) gh pr create \ --base "${{ matrix.target_branch }}" \ --head "${FORK_OWNER}:${{ env.sync_branch }}" \ --repo "${{ github.repository }}" \ - --title "🔄 Sync main branch changes to ${{ matrix.target_branch }}" \ + --title "Sync main → ${{ matrix.target_branch }}" \ --body "$PR_BODY" \ 2>&1 | tee pr_output.txt fi - - # Extract PR number if created + PR_NUMBER=$(grep -oP '(?<=pull/)\d+' pr_output.txt || echo "") - if [ -n "$PR_NUMBER" ]; then - echo "✅ Created PR #$PR_NUMBER" - - # Try to add labels if they exist (ignore errors) - gh pr edit "$PR_NUMBER" --add-label "automated" 2>/dev/null || true - gh pr edit "$PR_NUMBER" --add-label "sync" 2>/dev/null || true - gh pr edit "$PR_NUMBER" --add-label "${{ matrix.target_branch }}" 2>/dev/null || true - - echo "📋 PR URL: https://github.com/${{ github.repository }}/pull/$PR_NUMBER" - else - echo "⚠️ PR might already exist or creation failed. Check if a PR already exists for branch: ${{ env.sync_branch }}" + gh pr edit "$PR_NUMBER" --add-label "automated,sync,${{ matrix.target_branch }}" 2>/dev/null || true + echo "Created PR #$PR_NUMBER: https://github.com/${{ github.repository }}/pull/$PR_NUMBER" + echo "pr_number=$PR_NUMBER" >> $GITHUB_ENV fi env: GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }} - - name: Skip notification - if: steps.check_merge.outputs.needs_merge == 'false' - run: echo "ℹ️ No merge needed for ${{ matrix.target_branch }}" + - name: Comment on PR about excluded file changes + if: env.pr_number != '' && env.excluded_file_changes != '' + run: | + COMMENT_BODY=$(cat << 'COMMENTEOF' + ⚠️ **Manual review needed — version-specific files were modified on main** - net8-push-notification: - runs-on: ubuntu-latest - if: github.ref == 'refs/heads/net8' && github.actor == 'github-actions[bot]' + The following commits changed files listed in `.sync-exclude`. These files have different implementations per .NET version and were **not synced** automatically. You may need to manually apply the equivalent changes to the `${{ matrix.target_branch }}` version: - steps: - - name: Notify about bot push to net8 - run: | - echo "## 🤖 Bot Push to net8 Detected" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "This push to net8 branch was made by github-actions[bot] as part of the automated sync from main." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### What happened:" >> $GITHUB_STEP_SUMMARY - echo "- Changes from main were merged into net8" >> $GITHUB_STEP_SUMMARY - echo "- Version numbers updated (10.x.x → 8.x.x)" >> $GITHUB_STEP_SUMMARY - echo "- TargetFramework updated (net10.0 → net8.0)" >> $GITHUB_STEP_SUMMARY - echo "- .csproj files preserved from net8 branch" >> $GITHUB_STEP_SUMMARY + ${{ env.excluded_file_changes }} - net9-push-notification: - runs-on: ubuntu-latest - if: github.ref == 'refs/heads/net9' && github.actor == 'github-actions[bot]' + **What to do:** + 1. Review each commit above on `main` + 2. Determine if the change needs an equivalent update for `${{ matrix.target_branch }}` + 3. If so, apply the change manually using the version-specific API (e.g., `SetPropertyCalls` instead of `UpdateSettersBuilder`) + COMMENTEOF + ) - steps: - - name: Notify about bot push to net9 - run: | - echo "## 🤖 Bot Push to net9 Detected" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "This push to net9 branch was made by github-actions[bot] as part of the automated sync from main." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "### What happened:" >> $GITHUB_STEP_SUMMARY - echo "- Changes from main were merged into net9" >> $GITHUB_STEP_SUMMARY - echo "- Version numbers updated (10.x.x → 9.x.x)" >> $GITHUB_STEP_SUMMARY - echo "- TargetFramework updated (net10.0 → net9.0)" >> $GITHUB_STEP_SUMMARY - echo "- .csproj files preserved from net9 branch" >> $GITHUB_STEP_SUMMARY + gh pr comment "${{ env.pr_number }}" --body "$COMMENT_BODY" + env: + GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }} summary: needs: sync-branches @@ -477,15 +388,8 @@ jobs: run: | echo "## Branch Sync Summary" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - if [ "${{ needs.sync-branches.result }}" = "success" ]; then - echo "✅ All branch sync PRs created successfully" >> $GITHUB_STEP_SUMMARY + echo "All branch syncs completed successfully" >> $GITHUB_STEP_SUMMARY else - echo "❌ Some branch syncs failed" >> $GITHUB_STEP_SUMMARY + echo "Some branch syncs failed — check individual job logs" >> $GITHUB_STEP_SUMMARY fi - - echo "" >> $GITHUB_STEP_SUMMARY - echo "### Next Steps:" >> $GITHUB_STEP_SUMMARY - echo "- Review and merge the created PRs" >> $GITHUB_STEP_SUMMARY - echo "- Test changes on target branches" >> $GITHUB_STEP_SUMMARY - echo "- Target branches: net8, net9 (and any others in TARGET_BRANCHES variable)" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.gitignore b/.gitignore index 25751c56..e405ae2e 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,14 @@ msbuild.err msbuild.wrn .vs/ .idea/ + +# SQLite database files +*.db +*.db-shm +*.db-wal + +# Source generator temp output +tmpgen/ + +# ReSharper/Rider user settings +*.DotSettings.user diff --git a/.sync-exclude b/.sync-exclude new file mode 100644 index 00000000..78d90fdc --- /dev/null +++ b/.sync-exclude @@ -0,0 +1,12 @@ +# Files that must remain version-specific per target branch. +# These are reset to the target branch version after cherry-picking from main. +# +# Reason: EF Core 10 introduced UpdateSettersBuilder and IDbContextOptionsConfiguration +# which don't exist in EF Core 8/9. These files use different APIs per version. + +src/TickerQ.EntityFrameworkCore/Infrastructure/MappingExtensions.cs +src/TickerQ.EntityFrameworkCore/Infrastructure/BasePersistenceProvider.cs +src/TickerQ.EntityFrameworkCore/Infrastructure/TickerQueryExtensions.cs + +# Solution file — main uses .slnx (net10+), older branches use .sln +TickerQ.sln diff --git a/TickerQ.sln b/TickerQ.sln deleted file mode 100644 index affcd3de..00000000 --- a/TickerQ.sln +++ /dev/null @@ -1,272 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 18 -VisualStudioVersion = 18.3.11505.172 d18.3 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Utilities", "src\TickerQ.Utilities\TickerQ.Utilities.csproj", "{68DBCCE9-C774-4215-8CC1-7284D0D4DB24}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.EntityFrameworkCore", "src\TickerQ.EntityFrameworkCore\TickerQ.EntityFrameworkCore.csproj", "{A96850C7-35AD-4F5B-B31C-67333D55C548}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Dashboard", "src\TickerQ.Dashboard\TickerQ.Dashboard.csproj", "{67C99E39-EF62-4A83-B613-93AE39FC9DFD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ", "src\TickerQ\TickerQ.csproj", "{C69BE610-27A6-4720-849D-5A7AEF56BADE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.SourceGenerator", "src\TickerQ.SourceGenerator\TickerQ.SourceGenerator.csproj", "{1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{BA086F2D-2778-4F58-A9AA-45F560CE3504}" - ProjectSection(SolutionItems) = preProject - src\Directory.Build.props = src\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Solution Items", ".Solution Items", "{9A4EB4A4-FB92-477C-A6D8-0735579B7BAB}" - ProjectSection(SolutionItems) = preProject - Directory.Build.props = Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{61397D4B-87E7-4BE8-A674-EBCEDFBAE441}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Tests", "tests\TickerQ.Tests\TickerQ.Tests.csproj", "{4FA316D2-A206-45F2-AC16-69420E83E211}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{45D577FA-DB7A-4B96-BB3F-97DDA0A929D5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{9E6EC713-AD6D-4909-8617-B909D76A6E3A}" - ProjectSection(SolutionItems) = preProject - .github\workflows\build.yml = .github\workflows\build.yml - .github\workflows\pr.yaml = .github\workflows\pr.yaml - .github\workflows\publish.yml = .github\workflows\publish.yml - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Caching.StackExchangeRedis", "src\TickerQ.Caching.StackExchangeRedis\TickerQ.Caching.StackExchangeRedis.csproj", "{B3049104-9C15-4933-A440-CA62CFBC5F70}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Instrumentation.OpenTelemetry", "src\TickerQ.Instrumentation.OpenTelemetry\TickerQ.Instrumentation.OpenTelemetry.csproj", "{D87B9599-22C7-4E82-B300-1239E504E097}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Sample.WebApi", "samples\TickerQ.Sample.WebApi\TickerQ.Sample.WebApi.csproj", "{4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Sample.Console", "samples\TickerQ.Sample.Console\TickerQ.Sample.Console.csproj", "{723F26D9-C675-4883-8B62-AEBA370566D4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Sample.WorkerService", "samples\TickerQ.Sample.WorkerService\TickerQ.Sample.WorkerService.csproj", "{8FF073D6-F685-4662-B1C4-AC551917ACE0}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.SDK", "src\TickerQ.SDK\TickerQ.SDK.csproj", "{458E9E1E-A58D-43B8-9CFF-FFC84C715094}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.RemoteExecutor", "src\TickerQ.RemoteExecutor\TickerQ.RemoteExecutor.csproj", "{F8599439-948C-4856-ACD5-79CCBC13E9AE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.Sample.ApplicationDbContext", "samples\TickerQ.Sample.ApplicationDbContext\TickerQ.Sample.ApplicationDbContext.csproj", "{B49F8436-1408-CA3A-C69E-0EED0159C753}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TickerQ.EntityFrameworkCore.Tests", "tests\TickerQ.EntityFrameworkCore.Tests\TickerQ.EntityFrameworkCore.Tests.csproj", "{CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Debug|x64.ActiveCfg = Debug|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Debug|x64.Build.0 = Debug|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Debug|x86.ActiveCfg = Debug|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Debug|x86.Build.0 = Debug|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Release|Any CPU.Build.0 = Release|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Release|x64.ActiveCfg = Release|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Release|x64.Build.0 = Release|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Release|x86.ActiveCfg = Release|Any CPU - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24}.Release|x86.Build.0 = Release|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Debug|x64.ActiveCfg = Debug|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Debug|x64.Build.0 = Debug|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Debug|x86.ActiveCfg = Debug|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Debug|x86.Build.0 = Debug|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Release|Any CPU.Build.0 = Release|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Release|x64.ActiveCfg = Release|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Release|x64.Build.0 = Release|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Release|x86.ActiveCfg = Release|Any CPU - {A96850C7-35AD-4F5B-B31C-67333D55C548}.Release|x86.Build.0 = Release|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Debug|x64.ActiveCfg = Debug|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Debug|x64.Build.0 = Debug|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Debug|x86.ActiveCfg = Debug|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Debug|x86.Build.0 = Debug|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Release|Any CPU.Build.0 = Release|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Release|x64.ActiveCfg = Release|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Release|x64.Build.0 = Release|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Release|x86.ActiveCfg = Release|Any CPU - {67C99E39-EF62-4A83-B613-93AE39FC9DFD}.Release|x86.Build.0 = Release|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Debug|x64.ActiveCfg = Debug|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Debug|x64.Build.0 = Debug|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Debug|x86.ActiveCfg = Debug|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Debug|x86.Build.0 = Debug|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Release|Any CPU.Build.0 = Release|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Release|x64.ActiveCfg = Release|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Release|x64.Build.0 = Release|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Release|x86.ActiveCfg = Release|Any CPU - {C69BE610-27A6-4720-849D-5A7AEF56BADE}.Release|x86.Build.0 = Release|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Debug|x64.ActiveCfg = Debug|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Debug|x64.Build.0 = Debug|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Debug|x86.ActiveCfg = Debug|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Debug|x86.Build.0 = Debug|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Release|Any CPU.Build.0 = Release|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Release|x64.ActiveCfg = Release|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Release|x64.Build.0 = Release|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Release|x86.ActiveCfg = Release|Any CPU - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9}.Release|x86.Build.0 = Release|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Debug|x64.ActiveCfg = Debug|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Debug|x64.Build.0 = Debug|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Debug|x86.ActiveCfg = Debug|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Debug|x86.Build.0 = Debug|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Release|Any CPU.Build.0 = Release|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Release|x64.ActiveCfg = Release|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Release|x64.Build.0 = Release|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Release|x86.ActiveCfg = Release|Any CPU - {4FA316D2-A206-45F2-AC16-69420E83E211}.Release|x86.Build.0 = Release|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Debug|x64.ActiveCfg = Debug|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Debug|x64.Build.0 = Debug|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Debug|x86.ActiveCfg = Debug|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Debug|x86.Build.0 = Debug|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Release|Any CPU.Build.0 = Release|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Release|x64.ActiveCfg = Release|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Release|x64.Build.0 = Release|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Release|x86.ActiveCfg = Release|Any CPU - {B3049104-9C15-4933-A440-CA62CFBC5F70}.Release|x86.Build.0 = Release|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Debug|x64.ActiveCfg = Debug|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Debug|x64.Build.0 = Debug|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Debug|x86.ActiveCfg = Debug|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Debug|x86.Build.0 = Debug|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Release|Any CPU.Build.0 = Release|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Release|x64.ActiveCfg = Release|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Release|x64.Build.0 = Release|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Release|x86.ActiveCfg = Release|Any CPU - {D87B9599-22C7-4E82-B300-1239E504E097}.Release|x86.Build.0 = Release|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Debug|x64.ActiveCfg = Debug|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Debug|x64.Build.0 = Debug|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Debug|x86.ActiveCfg = Debug|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Debug|x86.Build.0 = Debug|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Release|Any CPU.Build.0 = Release|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Release|x64.ActiveCfg = Release|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Release|x64.Build.0 = Release|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Release|x86.ActiveCfg = Release|Any CPU - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E}.Release|x86.Build.0 = Release|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Debug|x64.ActiveCfg = Debug|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Debug|x64.Build.0 = Debug|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Debug|x86.ActiveCfg = Debug|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Debug|x86.Build.0 = Debug|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Release|Any CPU.Build.0 = Release|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Release|x64.ActiveCfg = Release|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Release|x64.Build.0 = Release|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Release|x86.ActiveCfg = Release|Any CPU - {723F26D9-C675-4883-8B62-AEBA370566D4}.Release|x86.Build.0 = Release|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Debug|x64.ActiveCfg = Debug|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Debug|x64.Build.0 = Debug|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Debug|x86.ActiveCfg = Debug|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Debug|x86.Build.0 = Debug|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Release|Any CPU.Build.0 = Release|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Release|x64.ActiveCfg = Release|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Release|x64.Build.0 = Release|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Release|x86.ActiveCfg = Release|Any CPU - {8FF073D6-F685-4662-B1C4-AC551917ACE0}.Release|x86.Build.0 = Release|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Debug|Any CPU.Build.0 = Debug|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Debug|x64.ActiveCfg = Debug|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Debug|x64.Build.0 = Debug|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Debug|x86.ActiveCfg = Debug|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Debug|x86.Build.0 = Debug|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Release|Any CPU.ActiveCfg = Release|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Release|Any CPU.Build.0 = Release|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Release|x64.ActiveCfg = Release|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Release|x64.Build.0 = Release|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Release|x86.ActiveCfg = Release|Any CPU - {458E9E1E-A58D-43B8-9CFF-FFC84C715094}.Release|x86.Build.0 = Release|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Debug|x64.ActiveCfg = Debug|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Debug|x64.Build.0 = Debug|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Debug|x86.ActiveCfg = Debug|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Debug|x86.Build.0 = Debug|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Release|Any CPU.Build.0 = Release|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Release|x64.ActiveCfg = Release|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Release|x64.Build.0 = Release|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Release|x86.ActiveCfg = Release|Any CPU - {F8599439-948C-4856-ACD5-79CCBC13E9AE}.Release|x86.Build.0 = Release|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Debug|x64.ActiveCfg = Debug|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Debug|x64.Build.0 = Debug|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Debug|x86.ActiveCfg = Debug|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Debug|x86.Build.0 = Debug|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Release|Any CPU.Build.0 = Release|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Release|x64.ActiveCfg = Release|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Release|x64.Build.0 = Release|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Release|x86.ActiveCfg = Release|Any CPU - {B49F8436-1408-CA3A-C69E-0EED0159C753}.Release|x86.Build.0 = Release|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Debug|x64.ActiveCfg = Debug|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Debug|x64.Build.0 = Debug|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Debug|x86.ActiveCfg = Debug|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Debug|x86.Build.0 = Debug|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Release|Any CPU.Build.0 = Release|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Release|x64.ActiveCfg = Release|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Release|x64.Build.0 = Release|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Release|x86.ActiveCfg = Release|Any CPU - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {68DBCCE9-C774-4215-8CC1-7284D0D4DB24} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {A96850C7-35AD-4F5B-B31C-67333D55C548} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {67C99E39-EF62-4A83-B613-93AE39FC9DFD} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {C69BE610-27A6-4720-849D-5A7AEF56BADE} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {1AE368A3-E3D9-4ECF-8979-5EAF8AFAADA9} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {4FA316D2-A206-45F2-AC16-69420E83E211} = {61397D4B-87E7-4BE8-A674-EBCEDFBAE441} - {9E6EC713-AD6D-4909-8617-B909D76A6E3A} = {9A4EB4A4-FB92-477C-A6D8-0735579B7BAB} - {B3049104-9C15-4933-A440-CA62CFBC5F70} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {D87B9599-22C7-4E82-B300-1239E504E097} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {4DC9FE10-966F-4C8A-B7D2-1215DC319B9E} = {45D577FA-DB7A-4B96-BB3F-97DDA0A929D5} - {723F26D9-C675-4883-8B62-AEBA370566D4} = {45D577FA-DB7A-4B96-BB3F-97DDA0A929D5} - {8FF073D6-F685-4662-B1C4-AC551917ACE0} = {45D577FA-DB7A-4B96-BB3F-97DDA0A929D5} - {458E9E1E-A58D-43B8-9CFF-FFC84C715094} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {F8599439-948C-4856-ACD5-79CCBC13E9AE} = {BA086F2D-2778-4F58-A9AA-45F560CE3504} - {B49F8436-1408-CA3A-C69E-0EED0159C753} = {45D577FA-DB7A-4B96-BB3F-97DDA0A929D5} - {CD2C9C52-E3ED-1E5F-8999-5F885472AFE3} = {61397D4B-87E7-4BE8-A674-EBCEDFBAE441} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {9F920FB4-439A-4F8A-9E49-20E39ADE8B0C} - EndGlobalSection -EndGlobal diff --git a/TickerQ.slnx b/TickerQ.slnx new file mode 100644 index 00000000..2b854dcc --- /dev/null +++ b/TickerQ.slnx @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tickerq-console.db b/tickerq-console.db deleted file mode 100644 index 4e86411b..00000000 Binary files a/tickerq-console.db and /dev/null differ diff --git a/tickerq-console.db-shm b/tickerq-console.db-shm deleted file mode 100644 index 94ce9d7f..00000000 Binary files a/tickerq-console.db-shm and /dev/null differ diff --git a/tickerq-console.db-wal b/tickerq-console.db-wal deleted file mode 100644 index d7770569..00000000 Binary files a/tickerq-console.db-wal and /dev/null differ