From 77aa742528482279012a4911a781b6b096b90fe6 Mon Sep 17 00:00:00 2001
From: 6543 <6543@obermui.de>
Date: Mon, 16 Nov 2020 20:22:49 +0100
Subject: [PATCH] Migration: Gitlab: Support Subdirectory (#13563)

Co-authored-by: techknowlogick <techknowlogick@gitea.io>
---
 modules/migrations/gitlab.go | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/modules/migrations/gitlab.go b/modules/migrations/gitlab.go
index d4b725b5be..06f4a4ba7f 100644
--- a/modules/migrations/gitlab.go
+++ b/modules/migrations/gitlab.go
@@ -11,6 +11,7 @@ import (
 	"io"
 	"net/http"
 	"net/url"
+	"path"
 	"strings"
 	"time"
 
@@ -87,6 +88,23 @@ func NewGitlabDownloader(ctx context.Context, baseURL, repoPath, username, passw
 		return nil, err
 	}
 
+	// split namespace and subdirectory
+	pathParts := strings.Split(strings.Trim(repoPath, "/"), "/")
+	for len(pathParts) > 2 {
+		if _, _, err = gitlabClient.Version.GetVersion(); err == nil {
+			break
+		}
+
+		baseURL = path.Join(baseURL, pathParts[0])
+		pathParts = pathParts[1:]
+		_ = gitlab.WithBaseURL(baseURL)(gitlabClient)
+		repoPath = strings.Join(pathParts, "/")
+	}
+	if err != nil {
+		log.Trace("Error could not get gitlab version: %v", err)
+		return nil, err
+	}
+
 	// Grab and store project/repo ID here, due to issues using the URL escaped path
 	gr, _, err := gitlabClient.Projects.GetProject(repoPath, nil, nil, gitlab.WithContext(ctx))
 	if err != nil {