Documentation ¶
Overview ¶
Package patch manages patch files as stored in the Microsoft Go repository alongside a submodule.
Index ¶
Constants ¶
const ConfigFileName = ".git-go-patch"
ConfigFileName is the name of the config file on disk. The name is similar to ".gitignore", etc.
Variables ¶
This section is empty.
Functions ¶
func Apply ¶
func Apply(config *FoundConfig, mode ApplyMode) error
Apply runs a Git command to apply the patches in the repository onto the submodule. The exact Git command used ("am" or "apply") depends on the patch mode.
func WalkGoPatches ¶
func WalkGoPatches(config *FoundConfig, fn func(string) error) error
WalkGoPatches finds patches in the given Microsoft Go repository root directory and runs fn once per patch file path. If fn returns an error, walking terminates and the error is returned. The walk iterates in the order the patches should be applied (alphabetical filename order).
func WalkPatches ¶
WalkPatches finds patches in the given directory and runs fn once per patch file path. If fn returns an error, walking terminates and the error is returned. The walk iterates in the order the patches should be applied (alphabetical filename order).
Types ¶
type ApplyMode ¶
type ApplyMode int
const ( // ApplyModeCommits applies patches as commits. This is useful for developing changes to the // patches, because the commits can later be automatically extracted back into patch files. // Creating these commits creates new commit hashes, so it is not desirable if the HEAD commit // should correspond to a "real" commit. ApplyModeCommits ApplyMode = iota // ApplyModeIndex applies patches as changes to the Git index and working tree. Doesn't change // HEAD: it will continue to point to the same commit--likely upstream. // // This makes it more difficult to develop and save changes, but it is still possible. Patch // changes show up as staged changes, and additional changes show up as unstaged changes, so // they can still be differentiated and preserved. ApplyModeIndex )
type Config ¶
type Config struct { // MinimumToolVersion, if defined, causes "git-go-patch" commands to refuse to run if the tool's // version is lower than this version. This can be used to introduce features into the // "git-go-patch" tool that don't work in previous versions, like new patch commands. MinimumToolVersion string // SubmoduleDir is the submodule directory to patch, relative to the config file. SubmoduleDir string // PatchesDir is the directory with patch files to use, relative to the config file. PatchesDir string // StatusFileDir is a gitignored directory to put workflow-related temporary status files, // relative to the config file. StatusFileDir string // ExtractAsAuthor makes "git-go-patch extract" set this author in the resulting patch file. // // This can be used to avoid patch file attribution confusion: when a patch goes through the // "apply" "rebase" "extract" process, the patch file's "author" field stays the same, but // someone else changed the content. This can make it appear that an author understands (or // endorses) a change, although they might not. Using this setting with (e.g.) a bot account // allows the project to consistently assign a single author to all patch files to avoid the // confusion. The correct way to see the contributors to a patch file is to view the patch // file's history, not the author line of the patch file. // // Example: "microsoft-golang-bot <microsoft-golang-bot@users.noreply.github.com>" ExtractAsAuthor string `json:",omitempty"` }
Config is the patch config file content. The default values are used as the default "init" content, so some fields are "omitempty" to avoid showing up by default.
type FoundConfig ¶
FoundConfig is a Config file's contents plus the location the config file was found, the RootDir.
func FindAncestorConfig ¶
func FindAncestorConfig(dir string) (*FoundConfig, error)
FindAncestorConfig finds and reads the config file governing dir. Searches dir and all ancestor directories of dir, similar to how ".git" files work.
If no config file is found in any ancestor, and an ancestor dir appears to be like microsoft/go by convention (contains a "patches" directory and a "go" directory), creates a config struct to fit the conventional repo.
func (*FoundConfig) FullPostPatchStatusFilePath ¶
func (c *FoundConfig) FullPostPatchStatusFilePath() string
FullPostPatchStatusFilePath is the full path to the "post-patch" status file. This may be used to determine if the submodule is fresh (the dev just ran "git go-patch apply" and nothing else) or if it might contain dev work that shouldn't be discarded.
func (*FoundConfig) FullPrePatchStatusFilePath ¶
func (c *FoundConfig) FullPrePatchStatusFilePath() string
FullPrePatchStatusFilePath is the full path to the "pre-patch" status file, which may store the commit hash before a "git go-patch apply" so "git go-patch extract" can use it later.
func (*FoundConfig) FullProjectRoots ¶
func (c *FoundConfig) FullProjectRoots() (rootDir, submoduleDir string)
FullProjectRoots returns the full path for the project and submodule root dirs. This function is provided for convenience while migrating old code onto the config file API.
func (*FoundConfig) FullStatusFileDir ¶
func (c *FoundConfig) FullStatusFileDir() string
FullStatusFileDir is the full status file dir path.
type MatchCheckRepo ¶
type MatchCheckRepo struct {
// contains filtered or unexported fields
}
MatchCheckRepo checks whether each patch in a series of patches makes actual changes, or if it is equivalent to an existing patch. The purpose is to let "git go-patch extract" ignore superficial differences like chunk line numbers and index hashes that would only distract code reviewers.
func NewMatchCheckRepo ¶
func NewMatchCheckRepo(submodulePath, baseCommit, patchesDir string) (*MatchCheckRepo, error)
NewMatchCheckRepo clones the given submodule to a temp repo and prepares to search the patchesDir for a match to each patch passed to Apply. Returns the created context for this process. Call the context's AttemptDelete method to clean up the temp dir if desired.
func (*MatchCheckRepo) AttemptDelete ¶
func (m *MatchCheckRepo) AttemptDelete()
AttemptDelete tries to delete the temp check repo dir. If an error occurs, log it, but this is not fatal. It is inside the user's temp dir, so it will be cleaned up later by the OS anyway.
func (*MatchCheckRepo) CheckedApply ¶
func (m *MatchCheckRepo) CheckedApply(path string, p *Patch) (string, error)
CheckedApply applies the patch at path to the MatchCheckRepo while checking for matches. If a matching patch is found, that patch's path is returned.
It is recommended to call this in a WalkPatches or WalkGoPatches fn: the method must be called once and only once for each patch, and the calls must be in the correct patch application order.