sticks 0.3.6

A tool for managing C and C++ projects
Documentation
name: Test Update Functionality

on:
  workflow_run:
    workflows: ["Release Packages"]
    types:
      - completed
  workflow_dispatch:

jobs:
  get-versions:
    name: Extract Release Versions
    runs-on: ubuntu-latest
    outputs:
      prev_version: ${{ steps.versions.outputs.PREV_VERSION }}
      new_version: ${{ steps.versions.outputs.NEW_VERSION }}
    steps:
      - name: Install jq
        run: sudo apt-get update && sudo apt-get install -y jq

      - name: Get versions
        id: versions
        run: |
          LATEST=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest \
            | jq -r '.tag_name' | sed 's/^v//')
          
          PREVIOUS=$(curl -s "https://api.github.com/repos/${{ github.repository }}/releases?per_page=2" \
            | jq -r '.[1].tag_name' | sed 's/^v//')
          
          if [ -z "$PREVIOUS" ] || [ -z "$LATEST" ] || [ "$PREVIOUS" = "null" ] || [ "$LATEST" = "null" ]; then
            echo "โŒ Failed to extract versions (need at least 2 releases)"
            echo "LATEST: $LATEST"
            echo "PREVIOUS: $PREVIOUS"
            exit 1
          fi
          
          echo "PREV_VERSION=$PREVIOUS" >> $GITHUB_OUTPUT
          echo "NEW_VERSION=$LATEST" >> $GITHUB_OUTPUT
          echo "โœ“ Detected versions - Previous: v$PREVIOUS, Latest: v$LATEST"

  test-deb-update:
    name: Test .deb Package Update
    runs-on: ubuntu-latest
    needs: get-versions
    if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
    
    steps:
      - name: Display test versions
        run: |
          echo "Testing update from v${{ needs.get-versions.outputs.prev_version }} to v${{ needs.get-versions.outputs.new_version }}"

      - name: Download previous version .deb
        run: |
          echo "๐Ÿ“ฅ Downloading previous version v${{ needs.get-versions.outputs.prev_version }}"
          curl -L -o sticks-old.deb \
            "https://github.com/${{ github.repository }}/releases/download/v${{ needs.get-versions.outputs.prev_version }}/sticks_${{ needs.get-versions.outputs.prev_version }}-1_amd64.deb"
          
          if [ ! -f sticks-old.deb ]; then
            echo "โŒ Failed to download previous version"
            exit 1
          fi
          
          ls -lh sticks-old.deb

      - name: Install previous version
        run: |
          echo "๐Ÿ“ฆ Installing previous version v${{ needs.get-versions.outputs.prev_version }}"
          sudo dpkg -i sticks-old.deb || sudo apt-get install -f -y
          
          echo "โœ“ Verifying installation"
          which sticks
          sticks --version

      - name: Verify previous version
        run: |
          VERSION_OUTPUT=$(sticks --version)
          echo "Installed version: $VERSION_OUTPUT"
          
          if echo "$VERSION_OUTPUT" | grep -q "${{ needs.get-versions.outputs.prev_version }}"; then
            echo "โœ“ Previous version installed correctly"
          else
            echo "โŒ Version mismatch!"
            exit 1
          fi

      - name: Test update command
        run: |
          echo "๐Ÿ”„ Testing update from v${{ needs.get-versions.outputs.prev_version }} to v${{ needs.get-versions.outputs.new_version }}"
          
          echo "y" | sticks update > /tmp/update.log 2>&1 || UPDATE_FAILED=1
          
          cat /tmp/update.log
          
          if [ "$UPDATE_FAILED" = "1" ]; then
            echo "โŒ Update command failed (exit code non-zero)"
            exit 1
          fi
          
          sleep 2
          
          echo "โœ“ Verifying updated version"
          sticks --version

      - name: Verify updated version
        run: |
          VERSION_OUTPUT=$(sticks --version)
          echo "Updated version: $VERSION_OUTPUT"
          
          if echo "$VERSION_OUTPUT" | grep -q "${{ needs.get-versions.outputs.new_version }}"; then
            echo "โœ… Update successful! Now running v${{ needs.get-versions.outputs.new_version }}"
          else
            echo "โŒ Update failed or version mismatch!"
            echo "Expected: ${{ needs.get-versions.outputs.new_version }}"
            echo "Got: $VERSION_OUTPUT"
            exit 1
          fi

      - name: Test basic functionality after update
        run: |
          echo "๐Ÿงช Testing basic functionality"
          
          mkdir -p /tmp/test-project
          cd /tmp/test-project
          
          echo "Creating test project..."
          sticks c test_app
          
          if [ -d "test_app" ]; then
            echo "โœ… Project creation works after update"
          else
            echo "โŒ Project creation failed"
            exit 1
          fi

  test-cargo-update:
    name: Test Cargo Install Update
    runs-on: ubuntu-latest
    needs: get-versions
    if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
    
    steps:
      - name: Display test versions
        run: |
          echo "Testing cargo install update from v${{ needs.get-versions.outputs.prev_version }} to v${{ needs.get-versions.outputs.new_version }}"

      - name: Install Rust
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable

      - name: Install previous version via cargo
        run: |
          echo "๐Ÿ“ฅ Installing previous version v${{ needs.get-versions.outputs.prev_version }} via cargo"
          cargo install sticks --version ${{ needs.get-versions.outputs.prev_version }} --force

      - name: Verify previous version
        run: |
          VERSION_OUTPUT=$(sticks --version)
          echo "Installed version: $VERSION_OUTPUT"
          
          if echo "$VERSION_OUTPUT" | grep -q "${{ needs.get-versions.outputs.prev_version }}"; then
            echo "โœ“ Previous version installed correctly via cargo"
          else
            echo "โŒ Version mismatch!"
            exit 1
          fi

      - name: Test update command
        run: |
          echo "๐Ÿ”„ Testing cargo-based update from v${{ needs.get-versions.outputs.prev_version }} to v${{ needs.get-versions.outputs.new_version }}"
          
          sticks update > /tmp/update.log 2>&1 || UPDATE_FAILED=1
          
          cat /tmp/update.log
          
          if [ "$UPDATE_FAILED" = "1" ]; then
            echo "โŒ Update command failed (exit code non-zero)"
            exit 1
          fi
          
          sleep 2
          
          echo "โœ“ Verifying updated version"
          sticks --version

      - name: Verify updated version
        run: |
          VERSION_OUTPUT=$(sticks --version)
          echo "Updated version: $VERSION_OUTPUT"
          
          if echo "$VERSION_OUTPUT" | grep -q "${{ needs.get-versions.outputs.new_version }}"; then
            echo "โœ… Update successful! Now running v${{ needs.get-versions.outputs.new_version }}"
          else
            echo "โŒ Update failed or version mismatch!"
            echo "Expected: ${{ needs.get-versions.outputs.new_version }}"
            echo "Got: $VERSION_OUTPUT"
            exit 1
          fi

      - name: Test basic functionality after update
        run: |
          echo "๐Ÿงช Testing basic functionality"
          
          mkdir -p /tmp/test-project
          cd /tmp/test-project
          
          echo "Creating test project..."
          sticks c test_app
          
          if [ -d "test_app" ]; then
            echo "โœ… Project creation works after update"
          else
            echo "โŒ Project creation failed"
            exit 1
          fi

  test-binary-update:
    name: Test Binary Update
    runs-on: ubuntu-latest
    needs: get-versions
    if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
    
    steps:
      - name: Display test versions
        run: |
          echo "Testing binary update from v${{ needs.get-versions.outputs.prev_version }} to v${{ needs.get-versions.outputs.new_version }}"

      - name: Download previous version binary
        run: |
          echo "๐Ÿ“ฅ Downloading previous version v${{ needs.get-versions.outputs.prev_version }}"
          curl -L -o sticks-old \
            "https://github.com/${{ github.repository }}/releases/download/v${{ needs.get-versions.outputs.prev_version }}/sticks-linux-x86_64"
          
          chmod +x sticks-old
          
          if [ ! -f sticks-old ]; then
            echo "โŒ Failed to download previous version"
            exit 1
          fi
          
          ls -lh sticks-old

      - name: Install previous version
        run: |
          echo "๐Ÿ“ฆ Installing previous version v${{ needs.get-versions.outputs.prev_version }}"
          mkdir -p ~/.local/bin
          mv sticks-old ~/.local/bin/sticks
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Verify previous version
        run: |
          export PATH="$HOME/.local/bin:$PATH"
          VERSION_OUTPUT=$(sticks --version)
          echo "Installed version: $VERSION_OUTPUT"
          
          if echo "$VERSION_OUTPUT" | grep -q "${{ needs.get-versions.outputs.prev_version }}"; then
            echo "โœ“ Previous version installed correctly"
          else
            echo "โŒ Version mismatch!"
            exit 1
          fi

      - name: Test update command
        run: |
          export PATH="$HOME/.local/bin:$PATH"
          echo "๐Ÿ”„ Testing binary update from v${{ needs.get-versions.outputs.prev_version }} to v${{ needs.get-versions.outputs.new_version }}"
          
          sticks update > /tmp/update.log 2>&1 || UPDATE_FAILED=1
          
          cat /tmp/update.log
          
          if [ "$UPDATE_FAILED" = "1" ]; then
            echo "โŒ Update command failed (exit code non-zero)"
            exit 1
          fi
          
          sleep 2
          
          echo "โœ“ Verifying updated version"
          sticks --version

      - name: Verify updated version
        run: |
          export PATH="$HOME/.local/bin:$PATH"
          VERSION_OUTPUT=$(sticks --version)
          echo "Updated version: $VERSION_OUTPUT"
          
          if echo "$VERSION_OUTPUT" | grep -q "${{ needs.get-versions.outputs.new_version }}"; then
            echo "โœ… Update successful! Now running v${{ needs.get-versions.outputs.new_version }}"
          else
            echo "โŒ Update failed or version mismatch!"
            echo "Expected: ${{ needs.get-versions.outputs.new_version }}"
            echo "Got: $VERSION_OUTPUT"
            exit 1
          fi

      - name: Test basic functionality after update
        run: |
          export PATH="$HOME/.local/bin:$PATH"
          echo "๐Ÿงช Testing basic functionality"
          
          mkdir -p /tmp/test-project
          cd /tmp/test-project
          
          echo "Creating test project..."
          sticks c test_app
          
          if [ -d "test_app" ]; then
            echo "โœ… Project creation works after update"
          else
            echo "โŒ Project creation failed"
            exit 1
          fi

  update-test-summary:
    name: Update Test Summary
    runs-on: ubuntu-latest
    needs: [get-versions, test-deb-update, test-cargo-update, test-binary-update]
    if: always()
    
    steps:
      - name: Check test results
        run: |
          echo "## Update Test Results" >> $GITHUB_STEP_SUMMARY
          echo "" >> $GITHUB_STEP_SUMMARY
          
          if [ "${{ needs.test-deb-update.result }}" = "success" ]; then
            echo "โœ… .deb package update: PASSED" >> $GITHUB_STEP_SUMMARY
          else
            echo "โŒ .deb package update: FAILED" >> $GITHUB_STEP_SUMMARY
          fi
          
          if [ "${{ needs.test-cargo-update.result }}" = "success" ]; then
            echo "โœ… Cargo install update: PASSED" >> $GITHUB_STEP_SUMMARY
          else
            echo "โŒ Cargo install update: FAILED" >> $GITHUB_STEP_SUMMARY
          fi
          
          if [ "${{ needs.test-binary-update.result }}" = "success" ]; then
            echo "โœ… Binary update: PASSED" >> $GITHUB_STEP_SUMMARY
          else
            echo "โŒ Binary update: FAILED" >> $GITHUB_STEP_SUMMARY
          fi
          
          echo "" >> $GITHUB_STEP_SUMMARY
          
          if [ "${{ needs.test-deb-update.result }}" = "success" ] && \
             [ "${{ needs.test-cargo-update.result }}" = "success" ] && \
             [ "${{ needs.test-binary-update.result }}" = "success" ]; then
            echo "๐ŸŽ‰ All update tests passed successfully!" >> $GITHUB_STEP_SUMMARY
            exit 0
          else
            echo "โš ๏ธ Some update tests failed. Please review the logs above." >> $GITHUB_STEP_SUMMARY
            exit 1
          fi