mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 21:16:26 +01:00 
			
		
		
		
	This PR registers requests with the process manager and manages hierarchy within the processes. Git repos are then associated with a context, (usually the request's context) - with sub commands using this context as their base context. Signed-off-by: Andrew Thornton <art27@cantab.net>
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright 2021 The Gitea Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a MIT-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package process
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
)
 | 
						|
 | 
						|
// Context is a wrapper around context.Context and contains the current pid for this context
 | 
						|
type Context struct {
 | 
						|
	context.Context
 | 
						|
	pid IDType
 | 
						|
}
 | 
						|
 | 
						|
// GetPID returns the PID for this context
 | 
						|
func (c *Context) GetPID() IDType {
 | 
						|
	return c.pid
 | 
						|
}
 | 
						|
 | 
						|
// GetParent returns the parent process context (if any)
 | 
						|
func (c *Context) GetParent() *Context {
 | 
						|
	return GetContext(c.Context)
 | 
						|
}
 | 
						|
 | 
						|
// Value is part of the interface for context.Context. We mostly defer to the internal context - but we return this in response to the ProcessContextKey
 | 
						|
func (c *Context) Value(key interface{}) interface{} {
 | 
						|
	if key == ProcessContextKey {
 | 
						|
		return c
 | 
						|
	}
 | 
						|
	return c.Context.Value(key)
 | 
						|
}
 | 
						|
 | 
						|
// ProcessContextKey is the key under which process contexts are stored
 | 
						|
var ProcessContextKey interface{} = "process-context"
 | 
						|
 | 
						|
// GetContext will return a process context if one exists
 | 
						|
func GetContext(ctx context.Context) *Context {
 | 
						|
	if pCtx, ok := ctx.(*Context); ok {
 | 
						|
		return pCtx
 | 
						|
	}
 | 
						|
	pCtxInterface := ctx.Value(ProcessContextKey)
 | 
						|
	if pCtxInterface == nil {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	if pCtx, ok := pCtxInterface.(*Context); ok {
 | 
						|
		return pCtx
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// GetPID returns the PID for this context
 | 
						|
func GetPID(ctx context.Context) IDType {
 | 
						|
	pCtx := GetContext(ctx)
 | 
						|
	if pCtx == nil {
 | 
						|
		return ""
 | 
						|
	}
 | 
						|
	return pCtx.GetPID()
 | 
						|
}
 | 
						|
 | 
						|
// GetParentPID returns the ParentPID for this context
 | 
						|
func GetParentPID(ctx context.Context) IDType {
 | 
						|
	var parentPID IDType
 | 
						|
	if parentProcess := GetContext(ctx); parentProcess != nil {
 | 
						|
		parentPID = parentProcess.GetPID()
 | 
						|
	}
 | 
						|
	return parentPID
 | 
						|
}
 |