diff --git a/src/main/rb/eca.rb b/src/main/rb/eca.rb index 1d3d20d05612e47802ab9c435f924d3d82fc5574..d04f3cb6680bfcb02664481ab83de6d4ff32815d 100644 --- a/src/main/rb/eca.rb +++ b/src/main/rb/eca.rb @@ -26,6 +26,10 @@ def process_commit(sha) } end +def nil_or_empty(o) + return o.nil? || o.empty? +end + ## read in the access token from secret file if (!File.file?("/etc/gitlab/eca-access-token")) puts "GL-HOOK-ERR: Internal server error, please contact administrator. Error, secret not found" @@ -47,19 +51,19 @@ stdin_args = stdin_raw.split(/\s+/) previous_head_commit = stdin_args[0] new_head_commit = stdin_args[1] -## Get the project ID from env var, extracting from pattern 'project-###' -project_id = ENV['GL_REPOSITORY'][8..-1] -project_path = ENV['GL_PROJECT_PATH'] -## When pushing group wikis, project_path may be empty -if (project_path.nil?) then - puts "Cannot retrieve project path, likely a group. Skipping validation" +gl_repo = ENV['GL_REPOSITORY'] +if (nil_or_empty(gl_repo)) then + puts "No Gitlab repository set, likely dealing with non-repo commit, skipping" exit 0 -end -## Check if current repo is a project wiki (no project ID and ends in .wiki) -if (project_id.nil? && project_path =~ WIKI_REGEX_MATCH) then - puts "Repository is a project wiki and not bound by ECA, skipping" +elsif (gl_repo =~ /^wiki-/) then + puts "Commit is associated with a wiki, and does not need to be validated. Skipping." exit 0 +elsif (gl_repo !~ /^project-/) then + puts "GL_REPOSITORY envvar is improperly set does not match expected format, cannot validate" + exit 1 end +## Get the project ID from env var, extracting from pattern 'project-###' +project_id = gl_repo[8..-1] ## Get data about project from API project_response = HTTParty.get("https://gitlab.eclipse.org/api/v4/projects/#{project_id}", @@ -68,18 +72,24 @@ project_response = HTTParty.get("https://gitlab.eclipse.org/api/v4/projects/#{pr }) ## Format data to be able to easily read and process it project_json_data = MultiJson.load(project_response.body) -if (project_json_data.nil? || project_json_data.class.name == 'Array') then +if (nil_or_empty(project_json_data) || project_json_data.class.name == 'Array') then puts "Couldn't load project data, assumed non-tracked project and skipping validation." exit 0 end ## Get the web URL, checking if project is a fork to get original project URL -if (!project_json_data['forked_from_project'].nil?) then +if (!nil_or_empty(project_json_data['forked_from_project'])) then puts "Non-Eclipse project repository detected: ECA validation will be skipped.\n\nNote that any issues with sign off or committer access will be flagged upon merging into the main project repository." exit 0 else project_url = project_json_data['web_url'] end +## This can happen for group wikis by inference from some production-only issues +if (nil_or_empty(project_url)) then + puts "Could not determine a web URL for project, likely not a fully-qualified project, skipping" + exit 0 +end + ## Get all new commits for branch, relative to itself for existing branch, relative to tree for new diff_git_commits_raw = '' if (previous_head_commit =~ /0+/) then