mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 00:11:04 +00:00 
			
		
		
		
	Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5734 Reviewed-by: Otto <otto@codeberg.org> Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
		
			
				
	
	
		
			115 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2024 The Forgejo Authors. All rights reserved.
 | 
						|
// SPDX-License-Identifier: GPL-3.0-or-later
 | 
						|
 | 
						|
package e2e
 | 
						|
 | 
						|
import (
 | 
						|
	"bufio"
 | 
						|
	"os"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"code.gitea.io/gitea/modules/log"
 | 
						|
 | 
						|
	"github.com/gobwas/glob"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	changesetFiles     []string
 | 
						|
	changesetAvailable bool
 | 
						|
	globalFullRun      bool
 | 
						|
)
 | 
						|
 | 
						|
func initChangedFiles() {
 | 
						|
	var changes string
 | 
						|
	changes, changesetAvailable = os.LookupEnv("CHANGED_FILES")
 | 
						|
	// the output of the Action seems to actually contain \n and not a newline literal
 | 
						|
	changesetFiles = strings.Split(changes, `\n`)
 | 
						|
	log.Info("Only running tests covered by a subset of test files. Received the following list of CHANGED_FILES: %q", changesetFiles)
 | 
						|
 | 
						|
	globalPatterns := []string{
 | 
						|
		// meta and config
 | 
						|
		"Makefile",
 | 
						|
		"playwright.config.ts",
 | 
						|
		".forgejo/workflows/testing.yml",
 | 
						|
		"tests/e2e/*.go",
 | 
						|
		"tests/e2e/shared/*",
 | 
						|
		// frontend files
 | 
						|
		"web_src/js/{index,utils}.*",
 | 
						|
		"web_src/css/{base,index}.css",
 | 
						|
		// templates and helpers
 | 
						|
		"templates/base/**",
 | 
						|
		"modules/templates/**",
 | 
						|
	}
 | 
						|
	fullRunPatterns := []glob.Glob{}
 | 
						|
	for _, expr := range globalPatterns {
 | 
						|
		fullRunPatterns = append(fullRunPatterns, glob.MustCompile(expr, '.', '/'))
 | 
						|
	}
 | 
						|
	globalFullRun = false
 | 
						|
	for _, changedFile := range changesetFiles {
 | 
						|
		for _, pattern := range fullRunPatterns {
 | 
						|
			if pattern.Match(changedFile) {
 | 
						|
				globalFullRun = true
 | 
						|
				log.Info("Changed files match global test pattern, running all tests")
 | 
						|
				return
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func canSkipTest(testFile string) bool {
 | 
						|
	// run all tests when environment variable is not set or changes match global pattern
 | 
						|
	if !changesetAvailable || globalFullRun {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
 | 
						|
	for _, changedFile := range changesetFiles {
 | 
						|
		if strings.HasSuffix(testFile, changedFile) {
 | 
						|
			return false
 | 
						|
		}
 | 
						|
		for _, pattern := range getWatchPatterns(testFile) {
 | 
						|
			if pattern.Match(changedFile) {
 | 
						|
				return false
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return true
 | 
						|
}
 | 
						|
 | 
						|
func getWatchPatterns(filename string) []glob.Glob {
 | 
						|
	file, err := os.Open(filename)
 | 
						|
	if err != nil {
 | 
						|
		log.Fatal(err.Error())
 | 
						|
	}
 | 
						|
	defer file.Close()
 | 
						|
	scanner := bufio.NewScanner(file)
 | 
						|
 | 
						|
	watchSection := false
 | 
						|
	patterns := []glob.Glob{}
 | 
						|
	for scanner.Scan() {
 | 
						|
		line := scanner.Text()
 | 
						|
		// check for watch block
 | 
						|
		if strings.HasPrefix(line, "// @watch") {
 | 
						|
			if watchSection {
 | 
						|
				break
 | 
						|
			}
 | 
						|
			watchSection = true
 | 
						|
		}
 | 
						|
		if !watchSection {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		line = strings.TrimPrefix(line, "// ")
 | 
						|
		if line != "" {
 | 
						|
			globPattern, err := glob.Compile(line, '.', '/')
 | 
						|
			if err != nil {
 | 
						|
				log.Fatal("Invalid glob pattern '%s' (skipped): %v", line, err)
 | 
						|
			}
 | 
						|
			patterns = append(patterns, globPattern)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	// if no watch block in file
 | 
						|
	if !watchSection {
 | 
						|
		patterns = append(patterns, glob.MustCompile("*"))
 | 
						|
	}
 | 
						|
	return patterns
 | 
						|
}
 |