question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

(Optionally) Ref to a branch and if it doesn't exist, use default

See original GitHub issue

Hey!

Is there a way to get a ref to work like an optional OR? For example:

// GITHUB_HEAD_REF being the name of the branch if my google-foo didn't fail me
ref: ${GITHUB_HEAD_REF} || master

My use-case: I have multiple repos that depend on each other sometimes. If they do, they all share the same branch name for a feature (e.g feature/add-tests). I want to pull the repos with those branches when they exist, but if they don’t (as it’s not always necessary to change code in all repos), it’ll pull master.

Thanks!

Issue Analytics

  • State:open
  • Created 2 years ago
  • Reactions:19
  • Comments:6

github_iconTop GitHub Comments

2reactions
tristan957commented, Aug 4, 2022

@vinayakkulkarni here is a pattern that I have been using.

https://github.com/hse-project/hse/blob/master/.github/workflows/builds.yaml#L99

Determine if branch exists using git ls-remote.

1reaction
chingccommented, Oct 3, 2022

I have a similar use case and was hoping actions/checkout would have something like a fallback-to-default boolean option. For the longest time I’ve been copy/pasting some ugly bash I wrote, but I recently got tired of it and wrote a composite action. I’ve included it below. The options you see are all the ones I need for my use case, so I didn’t bother adding anything else. Feel free to modify it. Hope you find it useful.

# .github/actions/checkout/action.yml

# This is essentially the same as actions/checkout, but will
# fallback to the default branch if the ref does not exist.
# https://github.com/actions/checkout

name: Checkout

inputs:
  fetch-depth:
    default: 1
    required: false
    type: number
  path:
    default: ''
    required: false
    type: string
  repository:
    default: ${{ github.repository }}
    required: false
    type: string
  ref:
    default: ''
    required: false
    type: string
  token:
    default: ${{ github.token }}
    required: false
    type: string

runs:
  using: composite

  steps:
  - id: repo
    shell: bash
    env:
      GH_TOKEN: ${{ inputs.token }}
    run: |
      if [[ -z "${{ inputs.ref }}" ]]
      then
        if [[ "${{ inputs.repository }}" != "${{ github.repository }}" ]]
        then
          USING="default branch"
        else
          USING="$(gh api /repos/${{ inputs.repository }}/commits/${{ github.sha }}/branches-where-head --jq '.[0].name')"
        fi
        echo "::notice::Checkout: ${{ inputs.repository }} using ${USING}"
        echo "::set-output name=ref-exists::true"
      else
        if git ls-remote --heads --quiet --exit-code https://${{ inputs.token }}@github.com/${{ inputs.repository }}.git ${{ inputs.ref }}
        then
          echo "::notice::Checkout: ${{ inputs.repository }} using ${{ inputs.ref }}"
          echo "::set-output name=ref-exists::true"
        else
          USING="$(gh api /repos/${{ inputs.repository }} --jq '.default_branch')"
          echo "::notice::Checkout: ${{ inputs.repository }} does not have ref ${{ inputs.ref }} (fallback to ${USING})"
          echo "::set-output name=ref-exists::false"
          echo "::set-output name=default-branch::${USING}"
        fi
      fi

  - if: steps.repo.outputs.ref-exists == 'true'
    uses: actions/checkout@v3
    with:
      fetch-depth: ${{ inputs.fetch-depth }}
      path: ${{ inputs.path }}
      repository: ${{ inputs.repository }}
      ref: ${{ inputs.ref }}
      token: ${{ inputs.token }}

  - if: steps.repo.outputs.ref-exists == 'false'
    uses: actions/checkout@v3
    with:
      fetch-depth: ${{ inputs.fetch-depth }}
      path: ${{ inputs.path }}
      repository: ${{ inputs.repository }}
      ref: ${{ steps.repo.outputs.default-branch }}
      token: ${{ inputs.token }}
Read more comments on GitHub >

github_iconTop Results From Across the Web

Git change branch when file of same name is present
The new behavior: if there is no local branch and multiple remote candidates, just die() and don't try reverting file whether it exists...
Read more >
Default branch - GitLab Docs
When you create a new project, GitLab creates a default branch in the repository. A default branch has special configuration options not shared...
Read more >
git-switch Documentation - Git
If the branch exists in multiple remotes and one of them is named by the checkout.defaultRemote configuration variable, we'll use that one for...
Read more >
git-push - Update remote refs along with associated objects
When the command line does not specify where to push with the <repository> argument, branch.*.remote configuration for the current branch is consulted to ......
Read more >
torch.hub — PyTorch 1.13 documentation
github (str) – a string with format <repo_owner/repo_name[:ref]> with an optional ref (a tag or a branch). If ref is not specified, the...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found