Skip to content

Extract the longest-matching ref from a commit path when multiple matches occur

Stan Hu requested to merge stanhu/gitlab-ce:fix-multiple-ref-prefix into master

What does this MR do?

This MR extracts the longest-matching ref from a commit path. In cases when there are multiple refs that prefix the path, the ref name is ambiguous. Using the heuristic that the longest-matching ref seems like a sensible default.

Why was this MR needed?

Suppose there is a branch named release/app and a tag named release/app/v1.0.0. Suppose README.md exists in the root directory.

Let's suppose the path passed in is release/app/v1.0.0/README.md. There are two possible ways to interpret the ref and path:

  1. ref = release/app, path = v1.0.0/README.md
  2. ref = release/app/v1.0.0, path = README.md

The crux of the issue is that there is ambiguity which one is correct; both could be real possibilities. In the current implementation of extract_ref, GitLab gets confused and tries neither: it uses ref = release and path = app/v1.0.0/README.md. Since the file does not exist, it returns 404.

What are the relevant issue numbers?

Closes #1839 (closed)

Merge request reports