- author
- authoring
- authoring_class
- buildozer
- change
- ChangeMessage
- Changes
- Console
- core
- destination_effect
- destination_reader
- destination_ref
- endpoint
- endpoint_provider
- feedback.context
- feedback.finish_hook_context
- feedback.revision_context
- filter_replace
- folder
- format
- gerrit_api_obj
- gerritapi.AccountInfo
- gerritapi.ApprovalInfo
- gerritapi.ChangeInfo
- gerritapi.ChangeMessageInfo
- gerritapi.ChangesQuery
- gerritapi.CommitInfo
- gerritapi.getActionInfo
- gerritapi.GitPersonInfo
- gerritapi.LabelInfo
- gerritapi.ParentCommitInfo
- gerritapi.ReviewResult
- gerritapi.RevisionInfo
- git
- git.mirrorContext
- git.mirrorContext.cherry_pick
- git.mirrorContext.create_branch
- git.mirrorContext.destination_fetch
- git.mirrorContext.destination_push
- git.mirrorContext.error
- git.mirrorContext.merge
- git.mirrorContext.noop
- git.mirrorContext.origin_fetch
- git.mirrorContext.rebase
- git.mirrorContext.record_effect
- git.mirrorContext.references
- git.mirrorContext.success
- git_merge_result
- github_api_obj
- github_api_obj.add_label
- github_api_obj.create_issue
- github_api_obj.create_status
- github_api_obj.delete_reference
- github_api_obj.get_authenticated_user
- github_api_obj.get_check_runs
- github_api_obj.get_combined_status
- github_api_obj.get_commit
- github_api_obj.get_pull_request_comment
- github_api_obj.get_pull_request_comments
- github_api_obj.get_pull_requests
- github_api_obj.get_reference
- github_api_obj.get_references
- github_api_obj.new_destination_ref
- github_api_obj.new_origin_ref
- github_api_obj.post_issue_comment
- github_api_obj.update_pull_request
- github_api_obj.update_reference
- glob
- Globals
- hg
- mapping_function
- metadata
- origin_ref
- patch
- Path
- PathAttributes
- re2
- re2_matcher
- re2_pattern
- SetReviewInput
- struct
- transformation
- transformation_status
- TransformWork
- ctx.add_label
- ctx.add_or_replace_label
- ctx.add_text_before_labels
- ctx.create_symlink
- ctx.destination_api
- ctx.destination_reader
- ctx.find_all_labels
- ctx.find_label
- ctx.new_path
- ctx.noop
- ctx.now_as_string
- ctx.origin_api
- ctx.read_path
- ctx.remove_label
- ctx.replace_label
- ctx.run
- ctx.set_author
- ctx.set_executable
- ctx.set_message
- ctx.success
- ctx.write_path
Represents the author of a change
Name | Description |
---|---|
string The email of the author |
|
name | string The name of the author |
The authors mapping between an origin and a destination
Create a list for an individual or team contributing code.
authoring_class
authoring.allowed(default, allowlist)
Parameter | Description |
---|---|
default | string The default author for commits in the destination. This is used in squash mode workflows or when users are not on the list. |
allowlist | sequence of string List of authors in the origin that are allowed to contribute code. The authors must be unique |
authoring.allowed(
default = "Foo Bar <noreply@foobar.com>",
allowlist = [
"someuser@myorg.com",
"other@myorg.com",
"another@myorg.com",
],
)
Some repositories are not based on email but use LDAPs/usernames. This is also supported since it is up to the origin how to check whether two authors are the same.
authoring.allowed(
default = "Foo Bar <noreply@foobar.com>",
allowlist = [
"someuser",
"other",
"another",
],
)
Use the default author for all the submits in the destination. Note that some destinations might choose to ignore this author and use the current user running the tool (In other words they don't allow impersonation).
authoring_class
authoring.overwrite(default)
Parameter | Description |
---|---|
default | string The default author for commits in the destination |
Create an authoring object that will overwrite any origin author with noreply@foobar.com mail.
authoring.overwrite("Foo Bar <noreply@foobar.com>")
Use the origin author as the author in the destination, no filtering.
authoring_class
authoring.pass_thru(default)
Parameter | Description |
---|---|
default | string The default author for commits in the destination. This is used in squash mode workflows or if author cannot be determined. |
authoring.pass_thru(default = "Foo Bar <noreply@foobar.com>")
The authors mapping between an origin and a destination
Module for Buildozer-related functionality such as creating and modifying BUILD targets.
Creates a Buildozer command. You can specify the reversal with the 'reverse' argument.
Command
buildozer.cmd(forward, reverse=None)
Parameter | Description |
---|---|
forward | string Specifies the Buildozer command, e.g. 'replace deps :foo :bar' |
reverse | string or NoneType The reverse of the command. This is only required if the given command cannot be reversed automatically and the reversal of this command is required by some workflow or Copybara check. The following commands are automatically reversible:
|
A transformation which creates a new build target and populates its attributes. This transform can reverse automatically to delete the target.
transformation
buildozer.create(target, rule_type, commands=[], before='', after='')
Parameter | Description |
---|---|
target | string Target to create, including the package, e.g. 'foo:bar'. The package can be '.' for the root BUILD file. |
rule_type | string Type of this rule, for instance, java_library. |
commands | sequence of string or sequence of Command Commands to populate attributes of the target after creating it. Elements can be strings such as 'add deps :foo' or objects returned by buildozer.cmd. |
before | string When supplied, causes this target to be created before the target named by 'before' |
after | string When supplied, causes this target to be created after the target named by 'after' |
A transformation which is the opposite of creating a build target. When run normally, it deletes a build target. When reversed, it creates and prepares one.
transformation
buildozer.delete(target, rule_type='', recreate_commands=[], before='', after='')
Parameter | Description |
---|---|
target | string Target to create, including the package, e.g. 'foo:bar' |
rule_type | string Type of this rule, for instance, java_library. Supplying this will cause this transformation to be reversible. |
recreate_commands | sequence of string or sequence of Command Commands to populate attributes of the target after creating it. Elements can be strings such as 'add deps :foo' or objects returned by buildozer.cmd. |
before | string When supplied with rule_type and the transformation is reversed, causes this target to be created before the target named by 'before' |
after | string When supplied with rule_type and the transformation is reversed, causes this target to be created after the target named by 'after' |
A transformation which runs one or more Buildozer commands against a single target expression. See http://go/buildozer for details on supported commands and target expression formats.
transformation
buildozer.modify(target, commands)
Parameter | Description |
---|---|
target | string or sequence of string Specifies the target(s) against which to apply the commands. Can be a list. |
commands | sequence of string or sequence of Command Commands to apply to the target(s) specified. Elements can be strings such as 'add deps :foo' or objects returned by buildozer.cmd. |
Add "config = ':foo'" to foo/bar:baz:
buildozer.modify(
target = 'foo/bar:baz',
commands = [
buildozer.cmd('set config ":foo"'),
],
)
Add "config = ':foo'" to foo/bar:baz and foo/bar:fooz:
buildozer.modify(
target = ['foo/bar:baz', 'foo/bar:fooz'],
commands = [
buildozer.cmd('set config ":foo"'),
],
)
A change metadata. Contains information like author, change message or detected labels
Name | Description |
---|---|
author | author The author of the change |
date_time_iso_offset | string Return a ISO offset date time. Example: 2011-12-03T10:15:30+01:00' |
first_line_message | string The message of the change |
labels | dict[string, string] A dictionary with the labels detected for the change. If the label is present multiple times it returns the last value. Note that this is a heuristic and it could include things that are not labels. |
labels_all_values | dict[string, sequence of string] A dictionary with the labels detected for the change. Note that the value is a collection of the values for each time the label was found. Use 'labels' instead if you are only interested in the last value. Note that this is a heuristic and it could include things that are not labels. |
merge | bool Returns true if the change represents a merge |
message | string The message of the change |
original_author | author The author of the change before any mapping |
ref | string Origin reference ref |
Represents a well formed parsed change message with its associated labels.
Name | Description |
---|---|
first_line | string First line of this message |
text | string The text description this message, not including the labels. |
Returns a list of values associated with the label name.
sequence of string
message.label_values(label_name)
Parameter | Description |
---|---|
label_name | string The label name. |
Data about the set of changes that are being migrated. Each change includes information like: original author, change message, labels, etc. You receive this as a field in TransformWork object for user defined transformations
Name | Description |
---|---|
current | sequence of change List of changes that will be migrated |
migrated | sequence of change List of changes that where migrated in previous Copybara executions or if using ITERATIVE mode in previous iterations of this workflow. |
A console that can be used in skylark transformations to print info, warning or error messages.
Show an error in the log. Note that this will stop Copybara execution.
console.error(message)
Parameter | Description |
---|---|
message | string message to log |
Show an info message in the console
console.info(message)
Parameter | Description |
---|---|
message | string message to log |
Show a progress message in the console
console.progress(message)
Parameter | Description |
---|---|
message | string message to log |
Show an info message in the console if verbose logging is enabled.
console.verbose(message)
Parameter | Description |
---|---|
message | string message to log |
Show a warning in the console
console.warn(message)
Parameter | Description |
---|---|
message | string message to log |
Core functionality for creating migrations, and basic transformations.
Name | Description |
---|---|
console | Console Returns a handle to the console object. |
main_config_path | string Location of the config file. This is subject to change |
Command line flags:
Name | Type | Description |
---|---|---|
--allow-empty-diff |
boolean | If set to false, Copybara will not write to the destination if the exact same change is already pending in the destination. Currently only supported for git.github_pr_destination and git.gerrit_destination . |
--commands-timeout |
duration | Commands timeout. Example values: 30s, 20m, 1h, etc. |
--config-root |
string | Configuration root path to be used for resolving absolute config labels like '//foo/bar' |
--console-file-flush-interval |
duration | How often Copybara should flush the console to the output file. (10s, 1m, etc.)If set to 0s, console will be flushed only at the end. Example values: 30s, 20m, 1h, etc. |
--console-file-path |
string | If set, write the console output also to the given file path. |
--debug-file-break |
string | Stop when file matching the glob changes |
--debug-metadata-break |
boolean | Stop when message and/or author changes |
--debug-transform-break |
string | Stop when transform description matches |
--disable-reversible-check |
boolean | If set, all workflows will be executed without reversible_check, overriding the workflow config and the normal behavior for CHANGE_REQUEST mode. |
--dry-run |
boolean | Run the migration in dry-run mode. Some destination implementations might have some side effects (like creating a code review), but never submit to a main branch. |
--event-monitor |
list | Eventmonitors to enable. These must be in the list of available monitors. |
--fetch-timeout |
duration | Fetch timeout. Example values: 30s, 20m, 1h, etc. |
--force |
boolean | Force the migration even if Copybara cannot find in the destination a change that is an ancestor of the one(s) being migrated. This should be used with care, as it could lose changes when migrating a previous/conflicting change. |
--info-list-only |
boolean | When set, the INFO command will print a list of workflows defined in the file. |
--noansi |
boolean | Don't use ANSI output for messages |
--nocleanup |
boolean | Cleanup the output directories. This includes the workdir, scratch clones of Git repos, etc. By default is set to false and directories will be cleaned prior to the execution. If set to true, the previous run output will not be cleaned up. Keep in mind that running in this mode will lead to an ever increasing disk usage. |
--output-limit |
int | Limit the output in the console to a number of records. Each subcommand might use this flag differently. Defaults to 0, which shows all the output. |
--output-root |
string | The root directory where to generate output files. If not set, ~/copybara/out is used by default. Use with care, Copybara might remove files inside this root if necessary. |
--squash |
boolean | Override workflow's mode with 'SQUASH'. This is useful mainly for workflows that use 'ITERATIVE' mode, when we want to run a single export with 'SQUASH', maybe to fix an issue. Always use --dry-run before, to test your changes locally. |
--validate-starlark |
string | Starlark should be validated prior to execution, but this might break legacy configs. Options are LOOSE, STRICT |
-v, --verbose |
boolean | Verbose output. |
Create a dynamic Skylark action. This should only be used by libraries developers. Actions are Starlark functions that receive a context, perform some side effect and return a result (success, error or noop).
dynamic.action
core.action(impl, params={})
Parameter | Description |
---|---|
impl | callable The Skylark function to call |
params | dict The parameters to the function. Will be available under ctx.params |
Copy files between directories and renames files
transformation
core.copy(before, after, paths=glob(["**"]), overwrite=False, regex_groups={})
Parameter | Description |
---|---|
before | string The name of the file or directory to copy. If this is the empty string and 'after' is a directory, then all files in the workdir will be copied to the sub directory specified by 'after', maintaining the directory tree. |
after | string The name of the file or directory destination. If this is the empty string and 'before' is a directory, then all files in 'before' will be copied to the repo root, maintaining the directory tree inside 'before'. |
paths | glob or NoneType A glob expression relative to 'before' if it represents a directory. Only files matching the expression will be copied. For example, glob(["**.java"]), matches all java files recursively inside 'before' folder. Defaults to match all the files recursively. |
overwrite | bool Overwrite destination files if they already exist. Note that this makes the transformation non-reversible, since there is no way to know if the file was overwritten or not in the reverse workflow. |
regex_groups | dict A set of named regexes that can be used to match part of the file name. Copybara uses re2 syntax. For example {"x": "[A-Za-z]+"} |
Move all the files in a directory to another directory:
core.copy("foo/bar_internal", "bar")
In this example, foo/bar_internal/one
will be copied to bar/one
.
Change a file extension:
core.copy(before = 'foo/${x}.txt', after = 'foo/${x}.md', regex_groups = { 'x': '.*'})
In this example, foo/bar/README.txt
will be copied to foo/bar/README.md
.
Copy all static files to a 'static' folder and use remove for reverting the change
core.transform(
[core.copy("foo", "foo/static", paths = glob(["**.css","**.html", ]))],
reversal = [core.remove(glob(['foo/static/**.css', 'foo/static/**.html']))]
)
Create a dynamic Skylark feedback migration. This should only be used by libraries developers
dynamic.action
core.dynamic_feedback(impl, params={})
Parameter | Description |
---|---|
impl | callable The Skylark function to call |
params | dict The parameters to the function. Will be available under ctx.params |
Create a dynamic Skylark transformation. This should only be used by libraries developers
transformation
core.dynamic_transform(impl, params={})
Parameter | Description |
---|---|
impl | callable The Skylark function to call |
params | dict The parameters to the function. Will be available under ctx.params |
To define a simple dynamic transformation, you don't even need to use core.dynamic_transform
. The following transformation sets the change's message to uppercase.
def test(ctx):
ctx.set_message(ctx.message.upper())
After defining this function, you can use test
as a transformation in core.workflow
.
If you want to create a library that uses dynamic transformations, you probably want to make them customizable. In order to do that, in your library.bara.sky, you need to hide the dynamic transformation (prefix with '_') and instead expose a function that creates the dynamic transformation with the param:
def _test_impl(ctx):
ctx.set_message(ctx.message + ctx.params['name'] + str(ctx.params['number']) + '\n')
def test(name, number = 2):
return core.dynamic_transform(impl = _test_impl,
params = { 'name': name, 'number': number})
After defining this function, you can use test('example', 42)
as a transformation in core.workflow
.
If invoked, it will fail the current migration as a noop
dynamic.action
core.fail_with_noop(msg)
Parameter | Description |
---|---|
msg | string The noop message |
Defines a migration of changes' metadata, that can be invoked via the Copybara command in the same way as a regular workflow migrates the change itself.
It is considered change metadata any information associated with a change (pending or submitted) that is not core to the change itself. A few examples:
- Comments: Present in any code review system. Examples: GitHub PRs or Gerrit code reviews.
- Labels: Used in code review systems for approvals and/or CI results. Examples: GitHub labels, Gerrit code review labels.
core.feedback(name, origin, destination, actions=[], description=None)
Parameter | Description |
---|---|
name | string The name of the feedback workflow. |
origin | trigger The trigger of a feedback migration. |
destination | endpoint_provider Where to write change metadata to. This is usually a code review system like Gerrit or GitHub PR. |
actions | sequence A list of feedback actions to perform, with the following semantics: |
description | string or NoneType A description of what this workflow achieves |
Applies an initial filtering to find a substring to be replaced and then applies a mapping
of replaces for the matched text.
filter_replace
core.filter_replace(regex, mapping={}, group=Whole text, paths=glob(["**"]), reverse=regex)
Parameter | Description |
---|---|
regex | string A re2 regex to match a substring of the file |
mapping | unknown A mapping function like core.replace_mapper or a dict with mapping values. |
group | int or NoneType Extract a regex group from the matching text and pass this as parameter to the mapping instead of the whole matching text. |
paths | glob or NoneType A glob expression relative to the workdir representing the files to apply the transformation. For example, glob(["**.java"]), matches all java files recursively. Defaults to match all the files recursively. |
reverse | string or NoneType A re2 regex used as reverse transformation |
Simplest mapping
core.filter_replace(
regex = 'a.*',
mapping = {
'afoo': 'abar',
'abaz': 'abam'
}
)
This replace is similar to what it can be achieved with core.todo_replace:
core.filter_replace(
regex = 'TODO\\((.*?)\\)',
group = 1,
mapping = core.replace_mapper([
core.replace(
before = '${p}foo${s}',
after = '${p}fooz${s}',
regex_groups = { 'p': '.*', 's': '.*'}
),
core.replace(
before = '${p}baz${s}',
after = '${p}bazz${s}',
regex_groups = { 'p': '.*', 's': '.*'}
),
],
all = True
)
)
Formats a String using Java's String.format
.
string
core.format(format, args)
Parameter | Description |
---|---|
format | string The format string |
args | sequence The arguments to format |
Selects the latest version that matches the format. Using --force in the CLI will force to use the reference passed as argument instead.
VersionSelector
core.latest_version(format, regex_groups={})
Parameter | Description |
---|---|
format | string The format of the version. If using it for git, it has to use the completerefspec (e.g. 'refs/tags/${n0}.${n1}.${n2}') |
regex_groups | dict A set of named regexes that can be used to match part of the versions. Copybara uses re2 syntax. Use the following nomenclature n0, n1, n2 for the version part (will use numeric sorting) or s0, s1, s2 (alphabetic sorting). Note that there can be mixed but the numbers cannot be repeated. In other words n0, s1, n2 is valid but not n0, s0, n1. n0 has more priority than n1. If there are fields where order is not important, use s(N+1) where N ist he latest sorted field. Example {"n0": "[0-9]+", "s1": "[a-z]+"} |
Example of how to match tags that follow semantic versioning
core.latest_version(
format = "refs/tags/${n0}.${n1}.${n2}", regex_groups = {
'n0': '[0-9]+', 'n1': '[0-9]+', 'n2': '[0-9]+', })
Moves files between directories and renames files
transformation
core.move(before, after, paths=glob(["**"]), overwrite=False, regex_groups={})
Parameter | Description |
---|---|
before | string The name of the file or directory before moving. If this is the empty string and 'after' is a directory, then all files in the workdir will be moved to the sub directory specified by 'after', maintaining the directory tree. |
after | string The name of the file or directory after moving. If this is the empty string and 'before' is a directory, then all files in 'before' will be moved to the repo root, maintaining the directory tree inside 'before'. |
paths | glob or NoneType A glob expression relative to 'before' if it represents a directory. Only files matching the expression will be moved. For example, glob(["**.java"]), matches all java files recursively inside 'before' folder. Defaults to match all the files recursively. |
overwrite | bool Overwrite destination files if they already exist. Note that this makes the transformation non-reversible, since there is no way to know if the file was overwritten or not in the reverse workflow. |
regex_groups | dict A set of named regexes that can be used to match part of the file name. Copybara uses re2 syntax. For example {"x": "[A-Za-z]+"} |
Move all the files in a directory to another directory:
core.move("foo/bar_internal", "bar")
In this example, foo/bar_internal/one
will be moved to bar/one
.
Move all the files in the checkout dir into a directory called foo:
core.move("", "foo")
In this example, one
and two/bar
will be moved to foo/one
and foo/two/bar
.
Move the contents of a folder to the checkout root directory:
core.move("foo", "")
In this example, foo/bar
would be moved to bar
.
Change a file extension:
core.move(before = 'foo/${x}.txt', after = 'foo/${x}.md', regex_groups = { 'x': '.*'})
In this example, foo/bar/README.txt
will be moved to foo/bar/README.md
.
Remove files from the workdir. This transformation is only meant to be used inside core.transform for reversing core.copy like transforms. For regular file filtering use origin_files exclude mechanism.
transformation
core.remove(paths)
Parameter | Description |
---|---|
paths | glob The files to be deleted |
Move all the files in a directory to another directory:
core.transform(
[core.copy("foo", "foo/public")],
reversal = [core.remove(glob(["foo/public/**"]))])
In this example, foo/one
will be moved to foo/public/one
.
Copy all static files to a 'static' folder and use remove for reverting the change
core.transform(
[core.copy("foo", "foo/static", paths = glob(["**.css","**.html", ]))],
reversal = [core.remove(glob(['foo/static/**.css', 'foo/static/**.html']))]
)
Replace a text with another text using optional regex groups. This transformation can be automatically reversed.
transformation
core.replace(before, after, regex_groups={}, paths=glob(["**"]), first_only=False, multiline=False, repeated_groups=False, ignore=[])
Parameter | Description |
---|---|
before | string The text before the transformation. Can contain references to regex groups. For example "foo${x}text".
If '$' literal character needs to be matched, ' |
after | string The text after the transformation. It can also contain references to regex groups, like 'before' field. |
regex_groups | dict A set of named regexes that can be used to match part of the replaced text.Copybara uses re2 syntax. For example {"x": "[A-Za-z]+"} |
paths | glob or NoneType A glob expression relative to the workdir representing the files to apply the transformation. For example, glob(["**.java"]), matches all java files recursively. Defaults to match all the files recursively. |
first_only | bool If true, only replaces the first instance rather than all. In single line mode, replaces the first instance on each line. In multiline mode, replaces the first instance in each file. |
multiline | bool Whether to replace text that spans more than one line. |
repeated_groups | bool Allow to use a group multiple times. For example foo${repeated}/${repeated}. Note that this won't match "fooX/Y". This mechanism doesn't use backtracking. In other words, the group instances are treated as different groups in regex construction and then a validation is done after that. |
ignore | sequence A set of regexes. Any line that matches any expression in this set, which might otherwise be transformed, will be ignored. |
Replaces the text "internal" with "external" in all java files
core.replace(
before = "internal",
after = "external",
paths = glob(["**.java"]),
)
core.replace(
before = '${end}',
after = 'Text to be added at the end',
multiline = True,
regex_groups = { 'end' : '\\z'},
)
Same as the above example but make the transformation reversible
core.transform([
core.replace(
before = '${end}',
after = 'some append',
multiline = True,
regex_groups = { 'end' : r'\z'},
)
],
reversal = [
core.replace(
before = 'some append${end}',
after = '',
multiline = True,
regex_groups = { 'end' : r'\z'},
)])
In this example we map some urls from the internal to the external version in all the files of the project.
core.replace(
before = "https://some_internal/url/${pkg}.html",
after = "https://example.com/${pkg}.html",
regex_groups = {
"pkg": ".*",
},
)
So a url like https://some_internal/url/foo/bar.html
will be transformed to https://example.com/foo/bar.html
.
This example removes blocks of text/code that are confidential and thus shouldn'tbe exported to a public repository.
core.replace(
before = "${x}",
after = "",
multiline = True,
regex_groups = {
"x": "(?m)^.*BEGIN-INTERNAL[\\w\\W]*?END-INTERNAL.*$\\n",
},
)
This replace would transform a text file like:
This is
public
// BEGIN-INTERNAL
confidential
information
// END-INTERNAL
more public code
// BEGIN-INTERNAL
more confidential
information
// END-INTERNAL
Into:
This is
public
more public code
A mapping function that applies a list of replaces until one replaces the text (Unless all = True
is used). This should be used with core.filter_replace or other transformations that accept text mapping as parameter.
mapping_function
core.replace_mapper(mapping, all=False)
Parameter | Description |
---|---|
mapping | sequence of transformation The list of core.replace transformations |
all | bool Run all the mappings despite a replace happens. |
Given a list of transformations, returns the list of transformations equivalent to undoing all the transformations
sequence of
transformation
core.reverse(transformations)
Parameter | Description |
---|---|
transformations | sequence of transformation The transformations to reverse |
Replace Google style TODOs. For example TODO(username, othername)
.
transformation
core.todo_replace(tags=['TODO', 'NOTE'], mapping={}, mode='MAP_OR_IGNORE', paths=glob(["**"]), default=None, ignore=None)
Parameter | Description |
---|---|
tags | sequence of string Prefix tag to look for |
mapping | dict Mapping of users/strings |
mode | string Mode for the replace:
|
paths | glob or NoneType A glob expression relative to the workdir representing the files to apply the transformation. For example, glob(["**.java"]), matches all java files recursively. Defaults to match all the files recursively. |
default | string or NoneType Default value if mapping not found. Only valid for 'MAP_OR_DEFAULT' or 'USE_DEFAULT' modes |
ignore | string or NoneType If set, elements within TODO (with usernames) that match the regex will be ignored. For example ignore = "foo" would ignore "foo" in "TODO(foo,bar)" but not "bar". |
Replace TODOs and NOTES for users in the mapping:
core.todo_replace(
mapping = {
'test1' : 'external1',
'test2' : 'external2'
}
)
Would replace texts like TODO(test1) or NOTE(test1, test2) with TODO(external1) or NOTE(external1, external2)
Remove text from inside TODOs
core.todo_replace(
mode = 'SCRUB_NAMES'
)
Would replace texts like TODO(test1): foo or NOTE(test1, test2):foo with TODO:foo and NOTE:foo
Ignore regEx inside TODOs when scrubbing/mapping
core.todo_replace(
mapping = { 'aaa' : 'foo'},
ignore = 'b/.*'
)
Would replace texts like TODO(b/123, aaa) with TODO(b/123, foo)
Groups some transformations in a transformation that can contain a particular, manually-specified, reversal, where the forward version and reversed version of the transform are represented as lists of transforms. The is useful if a transformation does not automatically reverse, or if the automatic reversal does not work for some reason.
If reversal is not provided, the transform will try to compute the reverse of the transformations list.
transformation
core.transform(transformations, reversal=The reverse of 'transformations', ignore_noop=None, noop_behavior=NOOP_IF_ANY_NOOP)
Parameter | Description |
---|---|
transformations | sequence of transformation The list of transformations to run as a result of running this transformation. |
reversal | sequence of transformation or NoneType The list of transformations to run as a result of running this transformation in reverse. |
ignore_noop | bool or NoneType WARNING: Deprecated. Use |
noop_behavior | string or NoneType How to handle no-op transformations:
|
Verifies that a RegEx matches (or not matches) the specified files. Does not transform anything, but will stop the workflow if it fails.
transformation
core.verify_match(regex, paths=glob(["**"]), verify_no_match=False, also_on_reversal=False)
Parameter | Description |
---|---|
regex | string The regex pattern to verify. To satisfy the validation, there has to be atleast one (or no matches if verify_no_match) match in each of the files included in paths. The re2j pattern will be applied in multiline mode, i.e. '^' refers to the beginning of a file and '$' to its end. Copybara uses re2 syntax. |
paths | glob or NoneType A glob expression relative to the workdir representing the files to apply the transformation. For example, glob(["**.java"]), matches all java files recursively. Defaults to match all the files recursively. |
verify_no_match | bool If true, the transformation will verify that the RegEx does not match. |
also_on_reversal | bool If true, the check will also apply on the reversal. The default behavior is to not verify the pattern on reversal. |
Defines a migration pipeline which can be invoked via the Copybara command.
Implicit labels that can be used/exposed:
- COPYBARA_CONTEXT_REFERENCE: Requested reference. For example if copybara is invoked as
copybara copy.bara.sky workflow master
, the value would bemaster
. - COPYBARA_LAST_REV: Last reference that was migrated
- COPYBARA_CURRENT_REV: The current reference being migrated
- COPYBARA_CURRENT_REV_DATE_TIME: Date & time for the current reference being migrated in ISO format (Example: "2011-12-03T10:15:30+01:00")
- COPYBARA_CURRENT_MESSAGE: The current message at this point of the transformations
- COPYBARA_CURRENT_MESSAGE_TITLE: The current message title (first line) at this point of the transformations
- COPYBARA_AUTHOR: The author of the change
core.workflow(name, origin, destination, authoring, transformations=[], origin_files=glob(["**"]), destination_files=glob(["**"]), mode="SQUASH", reversible_check=True for 'CHANGE_REQUEST' mode. False otherwise, check_last_rev_state=False, ask_for_confirmation=False, dry_run=False, after_migration=[], after_workflow=[], change_identity=None, set_rev_id=True, smart_prune=False, migrate_noop_changes=False, experimental_custom_rev_id=None, description=None, checkout=True, reversible_check_ignore_files=None)
Parameter | Description |
---|---|
name | string The name of the workflow. |
origin | origin Where to read from the code to be migrated, before applying the transformations. This is usually a VCS like Git, but can also be a local folder or even a pending change in a code review system like Gerrit. |
destination | destination Where to write to the code being migrated, after applying the transformations. This is usually a VCS like Git, but can also be a local folder or even a pending change in a code review system like Gerrit. |
authoring | authoring_class The author mapping configuration from origin to destination. |
transformations | sequence The transformations to be run for this workflow. They will run in sequence. |
origin_files | glob or NoneType A glob relative to the workdir that will be read from the origin during the import. For example glob(["**.java"]), all java files, recursively, which excludes all other file types. |
destination_files | glob or NoneType A glob relative to the root of the destination repository that matches files that are part of the migration. Files NOT matching this glob will never be removed, even if the file does not exist in the source. For example glob([''], exclude = ['/BUILD']) keeps all BUILD files in destination when the origin does not have any BUILD files. You can also use this to limit the migration to a subdirectory of the destination, e.g. glob(['java/src/'], exclude = ['/BUILD']) to only affect non-BUILD files in java/src. |
mode | string Workflow mode. Currently we support four modes:
|
reversible_check | bool or NoneType Indicates if the tool should try to to reverse all the transformations at the end to check that they are reversible. |
check_last_rev_state | bool If set to true, Copybara will validate that the destination didn't change since last-rev import for destination_files. Note that this flag doesn't work for CHANGE_REQUEST mode. |
ask_for_confirmation | bool Indicates that the tool should show the diff and require user's confirmation before making a change in the destination. |
dry_run | bool Run the migration in dry-run mode. Some destination implementations might have some side effects (like creating a code review), but never submit to a main branch. |
after_migration | sequence Run a feedback workflow after one migration happens. This runs once per change in |
after_workflow | sequence Run a feedback workflow after all the changes for this workflow run are migrated. Prefer |
change_identity | string or NoneType By default, Copybara hashes several fields so that each change has an unique identifier that at the same time reuses the generated destination change. This allows to customize the identity hash generation so that the same identity is used in several workflows. At least ${copybara_config_path} has to be present. Current user is added to the hash automatically.
|
set_rev_id | bool Copybara adds labels like 'GitOrigin-RevId' in the destination in order to track what was the latest change imported. For |
smart_prune | bool By default CHANGE_REQUEST workflows cannot restore scrubbed files. This flag does a best-effort approach in restoring the non-affected snippets. For now we only revert the non-affected files. This only works for CHANGE_REQUEST mode. |
migrate_noop_changes | bool By default, Copybara tries to only migrate changes that affect origin_files or config files. This flag allows to include all the changes. Note that it might generate more empty changes errors. In |
experimental_custom_rev_id | string or NoneType Use this label name instead of the one provided by the origin. This is subject to change and there is no guarantee. |
description | string or NoneType A description of what this workflow achieves |
checkout | bool Allows disabling the checkout. The usage of this feature is rare. This could be used to update a file of your own repo when a dependant repo version changes and you are not interested on the files of the dependant repo, just the new version. |
reversible_check_ignore_files | glob or NoneType Ignore the files matching the glob in the reversible check |
Command line flags:
Name | Type | Description |
---|---|---|
--change-request-from-sot-limit |
int | Number of origin baseline changes to use for trying to match one in the destination. It can be used if the are many parent changes in the origin that are a no-op in the destination |
--change-request-from-sot-retry |
list | Number of retries and delay between retries when we cannot find the baseline in the destination for CHANGE_REQUEST_FROM_SOT. For example '10,30,60' will retry three times. The first retry will be delayed 10s, the second one 30s and the third one 60s |
--change-request-parent, --change_request_parent |
string | Commit revision to be used as parent when importing a commit using CHANGE_REQUEST workflow mode. This shouldn't be needed in general as Copybara is able to detect the parent commit message. |
--check-last-rev-state |
boolean | If enabled, Copybara will validate that the destination didn't change since last-rev import for destination_files. Note that this flag doesn't work for CHANGE_REQUEST mode. |
--default-author |
string | Use this author as default instead of the one in the config file.Format should be 'Foo Bar foobar@example.com' |
--diff-in-origin |
boolean | When this flag is enabled, copybara will show different changes between last Revision and current revision in origin instead of in destination. NOTE: it Only works for SQUASH and ITERATIVE |
--force-author |
author | Force the author to this. Note that this only changes the author before the transformations happen, you can still use the transformations to alter it. |
--force-message |
string | Force the change description to this. Note that this only changes the message before the transformations happen, you can still use the transformations to alter it. |
--ignore-noop |
boolean | Only warn about operations/transforms that didn't have any effect. For example: A transform that didn't modify any file, non-existent origin directories, etc. |
--import-noop-changes |
boolean | By default Copybara will only try to migrate changes that could affect the destination. Ignoring changes that only affect excluded files in origin_files. This flag disables that behavior and runs for all the changes. |
--init-history |
boolean | Import all the changes from the beginning of the history up to the resolved ref. For 'ITERATIVE' workflows this will import individual changes since the first one. For 'SQUASH' it will import the squashed change up to the resolved ref. WARNING: Use with care, this flag should be used only for the very first run of Copybara for a workflow. |
--iterative-limit-changes |
int | Import just a number of changes instead of all the pending ones |
--last-rev |
string | Last revision that was migrated to the destination |
--nosmart-prune |
boolean | Disable smart prunning |
--notransformation-join |
boolean | By default Copybara tries to join certain transformations in one so that it is more efficient. This disables the feature. |
--read-config-from-change |
boolean | For each imported origin change, load the workflow's origin_files, destination_files and transformations from the config version of that change. The rest of the fields (more importantly, origin and destination) cannot change and the version from the first config will be used. |
--same-version |
boolean | Re-import the last version imported. This is useful for example to check that a refactor in a copy.bara.sky file doesn't introduce accidental changes. |
--squash-skip-history |
boolean | Avoid exposing the history of changes that are being migrated. This is useful when we want to migrate a new repository but we don't want to expose all the change history to metadata.squash_notes. |
--threads |
int | Number of threads to use when running transformations that change lot of files |
--threads-min-size |
int | Minimum size of the lists to process to run them in parallel |
--to-folder |
boolean | Sometimes a user wants to test what the outcome would be for a workflow without changing the configuration or adding an auxiliary testing workflow. This flags allowsto change an existing workflow to use folder.destination |
--workflow-identity-user |
string | Use a custom string as a user for computing change identity |
Represents an effect that happened in the destination due to a single migration
Name | Description |
---|---|
destination_ref | destination_ref Destination reference updated/created. Might be null if there was no effect. Might be set even if the type is error (For example a synchronous presubmit test failed but a review was created). |
errors | sequence of string List of errors that happened during the migration |
origin_refs | sequence of origin_ref List of origin changes that were included in this migration |
summary | string Textual summary of what happened. Users of this class should not try to parse this field. |
type | string Return the type of effect that happened: CREATED, UPDATED, NOOP, INSUFFICIENT_APPROVALS or ERROR |
Handle to read from the destination
Copy files from the destination into the workdir.
destination_reader.copy_destination_files(glob)
Parameter | Description |
---|---|
glob | glob Files to copy to the workdir, potentially overwriting files checked out from the origin. |
This can be added to the transformations of your core.workflow:
def _copy_destination_file(ctx):
content = ctx.destination_reader().copy_destination_files(glob(include = ['path/to/**']))
transforms = [core.dynamic_transform(_copy_destination_file)]
Would copy all files in path/to/ from the destination baseline to the copybara workdir. The files do not have to be covered by origin_files nor destination_files, but will cause errors if they are not covered by destination_files and not moved or deleted.
Checks whether a given file exists in the destination.
bool
destination_reader.file_exists(path)
Parameter | Description |
---|---|
path | string Path to the file. |
Read a file from the destination.
string
destination_reader.read_file(path)
Parameter | Description |
---|---|
path | string Path to the file. |
This can be added to the transformations of your core.workflow:
def _read_destination_file(ctx):
content = ctx.destination_reader().read_file(path = 'path/to/my_file.txt')
ctx.console.info(content)
transforms = [core.dynamic_transform(_read_destination_file)]
Would print out the content of path/to/my_file.txt in the destination. The file does not have to be covered by origin_files nor destination_files.
Reference to the change/review created/updated on the destination.
Name | Description |
---|---|
id | string Destination reference id |
type | string Type of reference created. Each destination defines its own and guarantees to be more stable than urls/ids |
url | string Url, if any, of the destination change |
An origin or destination API in a feedback migration.
Name | Description |
---|---|
url | string Return the URL of this endpoint. |
Creates a new destination reference out of this endpoint.
destination_ref
endpoint.new_destination_ref(ref, type, url=None)
Parameter | Description |
---|---|
ref | string The reference. |
type | string The type of this reference. |
url | string or NoneType The url associated with this reference, if any. |
Creates a new origin reference out of this endpoint.
origin_ref
endpoint.new_origin_ref(ref)
Parameter | Description |
---|---|
ref | string The reference. |
An handle for an origin or destination API in a feedback migration.
Name | Description |
---|---|
url | string Return the URL of this endpoint, if any. |
Creates a new destination reference out of this endpoint.
destination_ref
endpoint_provider.new_destination_ref(ref, type, url=None)
Parameter | Description |
---|---|
ref | string The reference. |
type | string The type of this reference. |
url | string or NoneType The url associated with this reference, if any. |
Creates a new origin reference out of this endpoint.
origin_ref
endpoint_provider.new_origin_ref(ref)
Parameter | Description |
---|---|
ref | string The reference. |
Gives access to the feedback migration information and utilities. This context is a concrete implementation for feedback migrations.
Name | Description |
---|---|
action_name | string The name of the current action. |
cli_labels | dict[string, string] Access labels that a user passes through flag '--labels'. For example: --labels=foo:value1,bar:value2. Then it can access in this way:cli_labels['foo']. |
console | Console Get an instance of the console to report errors or warnings |
destination | endpoint An object representing the destination. Can be used to query or modify the destination state |
feedback_name | string The name of the Feedback migration calling this action. |
origin | endpoint An object representing the origin. Can be used to query about the ref or modifying the origin state |
params | dict Parameters for the function if created with core.action |
refs | sequence of string A list containing string representations of the entities that triggered the event |
Returns an error action result.
dynamic.action_result
feedback.context.error(msg)
Parameter | Description |
---|---|
msg | string The error message |
Returns a no op action result with an optional message.
dynamic.action_result
feedback.context.noop(msg=None)
Parameter | Description |
---|---|
msg | string or NoneType The no op message |
Records an effect of the current action.
feedback.context.record_effect(summary, origin_refs, destination_ref, errors=[], type="UPDATED")
Parameter | Description |
---|---|
summary | string The summary of this effect |
origin_refs | sequence of origin_ref The origin refs |
destination_ref | destination_ref The destination ref |
errors | sequence of string An optional list of errors |
type | string The type of migration effect:
|
Returns a successful action result.
dynamic.action_result
feedback.context.success()
Gives access to the feedback migration information and utilities. This context is a concrete implementation for 'after_migration' hooks.
Name | Description |
---|---|
action_name | string The name of the current action. |
cli_labels | dict[string, string] Access labels that a user passes through flag '--labels'. For example: --labels=foo:value1,bar:value2. Then it can access in this way:cli_labels['foo']. |
console | Console Get an instance of the console to report errors or warnings |
destination | endpoint An object representing the destination. Can be used to query or modify the destination state |
effects | sequence of destination_effect The list of effects that happened in the destination |
origin | endpoint An object representing the origin. Can be used to query about the ref or modifying the origin state |
params | dict Parameters for the function if created with core.action |
revision | feedback.revision_context Get the requested/resolved revision |
Returns an error action result.
dynamic.action_result
feedback.finish_hook_context.error(msg)
Parameter | Description |
---|---|
msg | string The error message |
Returns a no op action result with an optional message.
dynamic.action_result
feedback.finish_hook_context.noop(msg=None)
Parameter | Description |
---|---|
msg | string or NoneType The no op message |
Records an effect of the current action.
feedback.finish_hook_context.record_effect(summary, origin_refs, destination_ref, errors=[], type="UPDATED")
Parameter | Description |
---|---|
summary | string The summary of this effect |
origin_refs | sequence of origin_ref The origin refs |
destination_ref | destination_ref The destination ref |
errors | sequence of string An optional list of errors |
type | string The type of migration effect:
|
Returns a successful action result.
dynamic.action_result
feedback.finish_hook_context.success()
Information about the revision request/resolved for the migration
Name | Description |
---|---|
labels | dict[string, sequence of string] A dictionary with the labels detected for the requested/resolved revision. |
A core.filter_replace transformation
Module for dealing with local filesystem folders
A folder destination is a destination that puts the output in a folder. It can be used both for testing or real production migrations.Given that folder destination does not support a lot of the features of real VCS, there are some limitations on how to use it:
- It requires passing a ref as an argument, as there is no way of calculating previous migrated changes. Alternatively, --last-rev can be used, which could migrate N changes.
- Most likely, the workflow should use 'SQUASH' mode, as history is not supported.
- If 'ITERATIVE' mode is used, a new temp directory will be created for each change migrated.
destination
folder.destination()
Command line flags:
Name | Type | Description |
---|---|---|
--folder-dir |
string | Local directory to write the output of the migration to. If the directory exists, all files will be deleted. By default Copybara will generate a temporary directory, so you shouldn't need this. |
A folder origin is a origin that uses a folder as input. The folder is specified via the source_ref argument.
origin
folder.origin(materialize_outside_symlinks=False)
Parameter | Description |
---|---|
materialize_outside_symlinks | bool By default folder.origin will refuse any symlink in the migration folder that is an absolute symlink or that refers to a file outside of the folder. If this flag is set, it will materialize those symlinks as regular files in the checkout directory. |
Command line flags:
Name | Type | Description |
---|---|---|
--folder-origin-author |
string | Deprecated. Please use '--force-author'. Author of the change being migrated from folder.origin() |
--folder-origin-ignore-invalid-symlinks |
boolean | If an invalid symlink is found, ignore it instead of failing |
--folder-origin-message |
string | Deprecated. Please use '--force-message'. Message of the change being migrated from folder.origin() |
Module for formatting the code to Google's style/guidelines
Formats the BUILD files using buildifier.
transformation
format.buildifier(paths=glob(["**.bzl", "**/BUILD", "BUILD"]), type='auto', lint="OFF", lint_warnings=[])
Parameter | Description |
---|---|
paths | glob or NoneType Paths of the files to format relative to the workdir. |
type | string or NoneType The type of the files. Can be 'auto', 'bzl', 'build' or 'workspace'. Note that this is not recommended to be set and might break in the future. The default is 'auto'. This mode formats as BUILD files "BUILD", "BUILD.bazel", "WORKSPACE" and "WORKSPACE.bazel" files. The rest as bzl files. Prefer to use those names for BUILD files instead of setting this flag. |
lint | string or NoneType If buildifier --lint should be used. This fixes several common issues. Note that this transformation is difficult to revert. For example if it removes a load statement because is not used after removing a rule, then the reverse workflow needs to add back the load statement (core.replace or similar). Possible values: |
lint_warnings | sequence of string Warnings used in the lint mode. Default is buildifier default` |
The default parameters formats all BUILD and bzl files in the checkout directory:
format.buildifier()
Enable lint for buildifier
format.buildifier(lint = "FIX")
Globs can be used to match only certain files:
format.buildifier(
paths = glob(["foo/BUILD", "foo/**/BUILD"], exclude = ["foo/bar/BUILD"])
)
Formats all the BUILD files inside foo
except for foo/bar/BUILD
Command line flags:
Name | Type | Description |
---|---|---|
--buildifier-batch-size |
int | Process files in batches this size |
Gerrit API endpoint implementation for feedback migrations and after migration hooks.
Name | Description |
---|---|
url | string Return the URL of this endpoint. |
Delete a label vote from an account owner on a Gerrit change.
gerrit_api_obj.delete_vote(change_id, account_id, label_id)
Parameter | Description |
---|---|
change_id | string The Gerrit change id. |
account_id | string The account owner who votes on label_id. Use 'me' or 'self' if the account owner makes this api call |
label_id | string The name of the label. |
Retrieve the actions of a Gerrit change.
dict[string, gerritapi.getActionInfo]
gerrit_api_obj.get_actions(id, revision)
Parameter | Description |
---|---|
id | string The change id or change number. |
revision | string The revision of the change. |
Retrieve a Gerrit change.
gerritapi.ChangeInfo
gerrit_api_obj.get_change(id, include_results=['LABELS'])
Parameter | Description |
---|---|
id | string The change id or change number. |
include_results | sequence of string What to include in the response. See https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#query-options |
Get changes from Gerrit based on a query. See https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#list-changes.
sequence of
gerritapi.ChangeInfo
gerrit_api_obj.list_changes(query, include_results=[])
Parameter | Description |
---|---|
query | string The query string to list changes by. See https://gerrit-review.googlesource.com/Documentation/user-search.html#_basic_change_search. |
include_results | sequence of string What to include in the response. See https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#query-options |
Creates a new destination reference out of this endpoint.
destination_ref
gerrit_api_obj.new_destination_ref(ref, type, url=None)
Parameter | Description |
---|---|
ref | string The reference. |
type | string The type of this reference. |
url | string or NoneType The url associated with this reference, if any. |
Creates a new origin reference out of this endpoint.
origin_ref
gerrit_api_obj.new_origin_ref(ref)
Parameter | Description |
---|---|
ref | string The reference. |
Post a review to a Gerrit change for a particular revision. The review will be authored by the user running the tool, or the role account if running in the service.
gerritapi.ReviewResult
gerrit_api_obj.post_review(change_id, revision_id, review_input)
Parameter | Description |
---|---|
change_id | string The Gerrit change id. |
revision_id | string The revision for which the comment will be posted. |
review_input | SetReviewInput The review to post to Gerrit. |
Gerrit account information.
Name | Description |
---|---|
account_id | string The numeric ID of the account. |
string The email address the user prefers to be contacted through. |
|
name | string The full name of the user. |
secondary_emails | sequence of string A list of the secondary email addresses of the user. |
username | string The username of the user. |
Gerrit approval information.
Name | Description |
---|---|
account_id | string The numeric ID of the account. |
date | string The time and date describing when the approval was made. |
string The email address the user prefers to be contacted through. |
|
name | string The full name of the user. |
secondary_emails | sequence of string A list of the secondary email addresses of the user. |
username | string The username of the user. |
value | int The vote that the user has given for the label. If present and zero, the user is permitted to vote on the label. If absent, the user is not permitted to vote on that label. |
Gerrit change information.
Name | Description |
---|---|
branch | string The name of the target branch. |
change_id | string The Change-Id of the change. |
created | string The timestamp of when the change was created. |
current_revision | string The commit ID of the current patch set of this change. |
id | string The ID of the change in the format " |
labels | dict[string, gerritapi.LabelInfo] The labels of the change as a map that maps the label names to LabelInfo entries. |
messages | sequence of gerritapi.ChangeMessageInfo Messages associated with the change as a list of ChangeMessageInfo entities. |
number | string The legacy numeric ID of the change. |
owner | gerritapi.AccountInfo The owner of the change as an AccountInfo entity. |
project | string The name of the project. |
revisions | dict[string, gerritapi.RevisionInfo] All patch sets of this change as a map that maps the commit ID of the patch set to a RevisionInfo entity. |
status | string The status of the change (NEW, MERGED, ABANDONED). |
subject | string The subject of the change (header line of the commit message). |
submittable | bool Whether the change has been approved by the project submit rules. Only set if requested via additional field SUBMITTABLE. |
submitted | string The timestamp of when the change was submitted. |
topic | string The topic to which this change belongs. |
updated | string The timestamp of when the change was last updated. |
Gerrit change message information.
Name | Description |
---|---|
author | gerritapi.AccountInfo Author of the message as an AccountInfo entity. |
date | string The timestamp of when this identity was constructed. |
id | string The ID of the message. |
message | string The text left by the user. |
real_author | gerritapi.AccountInfo Real author of the message as an AccountInfo entity. |
revision_number | int Which patchset (if any) generated this message. |
tag | string Value of the tag field from ReviewInput set while posting the review. NOTE: To apply different tags on on different votes/comments multiple invocations of the REST call are required. |
Input for listing Gerrit changes. See https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#list-changes
Gerrit commit information.
Name | Description |
---|---|
author | gerritapi.GitPersonInfo The author of the commit as a GitPersonInfo entity. |
commit | string The commit ID. Not set if included in a RevisionInfo entity that is contained in a map which has the commit ID as key. |
committer | gerritapi.GitPersonInfo The committer of the commit as a GitPersonInfo entity. |
message | string The commit message. |
parents | sequence of gerritapi.ParentCommitInfo The parent commits of this commit as a list of CommitInfo entities. In each parent only the commit and subject fields are populated. |
subject | string The subject of the commit (header line of the commit message). |
Gerrit actions information.
Name | Description |
---|---|
enabled | bool If true the action is permitted at this time and the caller is likely allowed to execute it. |
label | string Short title to display to a user describing the action |
Git person information.
Name | Description |
---|---|
date | string The timestamp of when this identity was constructed. |
string The email address of the author/committer. |
|
name | string The name of the author/committer. |
Gerrit label information.
Name | Description |
---|---|
all | sequence of gerritapi.ApprovalInfo List of all approvals for this label as a list of ApprovalInfo entities. Items in this list may not represent actual votes cast by users; if a user votes on any label, a corresponding ApprovalInfo will appear in this list for all labels. |
approved | gerritapi.AccountInfo One user who approved this label on the change (voted the maximum value) as an AccountInfo entity. |
blocking | bool If true, the label blocks submit operation. If not set, the default is false. |
default_value | int The default voting value for the label. This value may be outside the range specified in permitted_labels. |
disliked | gerritapi.AccountInfo One user who disliked this label on the change (voted negatively, but not the minimum value) as an AccountInfo entity. |
recommended | gerritapi.AccountInfo One user who recommended this label on the change (voted positively, but not the maximum value) as an AccountInfo entity. |
rejected | gerritapi.AccountInfo One user who rejected this label on the change (voted the minimum value) as an AccountInfo entity. |
value | int The voting value of the user who recommended/disliked this label on the change if it is not |
values | dict[string, string] A map of all values that are allowed for this label. The map maps the values ( |
Gerrit parent commit information.
Name | Description |
---|---|
commit | string The commit ID. Not set if included in a RevisionInfo entity that is contained in a map which has the commit ID as key. |
subject | string The subject of the commit (header line of the commit message). |
Gerrit review result.
Name | Description |
---|---|
labels | dict[string, int] Map of labels to values after the review was posted. |
ready | bool If true, the change was moved from WIP to ready for review as a result of this action. Not set if false. |
Gerrit revision information.
Name | Description |
---|---|
commit | gerritapi.CommitInfo The commit of the patch set as CommitInfo entity. |
created | string The timestamp of when the patch set was created. |
kind | string The change kind. Valid values are REWORK, TRIVIAL_REBASE, MERGE_FIRST_PARENT_UPDATE, NO_CODE_CHANGE, and NO_CHANGE. |
patchset_number | int The patch set number, or edit if the patch set is an edit. |
ref | string The Git reference for the patch set. |
uploader | gerritapi.AccountInfo The uploader of the patch set as an AccountInfo entity. |
Set of functions to define Git origins and destinations.
Command line flags:
Name | Type | Description |
---|---|---|
--experiment-checkout-affected-files |
boolean | If set, copybara will only checkout affected files at git origin. Note that this is experimental. |
--git-credential-helper-store-file |
string | Credentials store file to be used. See https://git-scm.com/docs/git-credential-store |
--git-no-verify |
boolean | Pass the '--no-verify' option to git pushes and commits to disable git commit hooks. |
--git-tag-overwrite |
boolean | If set, copybara will force update existing git tag |
--nogit-credential-helper-store |
boolean | Disable using credentials store. See https://git-scm.com/docs/git-credential-store |
--nogit-prompt |
boolean | Disable username/password prompt and fail if no credentials are found. This flag sets the environment variable GIT_TERMINAL_PROMPT which is intended for automated jobs running Git https://git-scm.com/docs/git/2.3.0#git-emGITTERMINALPROMPTem |
Creates a commit in a git repository using the transformed worktree.
For GitHub use git.github_destination. For creating Pull Requests in GitHub, use git.github_pr_destination. For creating a Gerrit change use git.gerrit_destination.
Given that Copybara doesn't ask for user/password in the console when doing the push to remote repos, you have to use ssh protocol, have the credentials cached or use a credential manager.
destination
git.destination(url, push='master', tag_name=None, tag_msg=None, fetch=None, partial_fetch=False, integrates=None, primary_branch_migration=False, checker=None)
Parameter | Description |
---|---|
url | string Indicates the URL to push to as well as the URL from which to get the parent commit |
push | string Reference to use for pushing the change, for example 'main'. |
tag_name | string or NoneType A template string that refers to a tag name. If tag_name exists, overwrite this tag only if flag git-tag-overwrite is set. Note that tag creation is best-effort and migration will succeed even if the tag cannot be created. Usage: Users can use a string or a string with a label. For instance ${label}_tag_name. And the value of label must be in changes' label list. Otherwise, tag won't be created. |
tag_msg | string or NoneType A template string that refers to the commit msg of a tag. If set, we will create an annotated tag when tag_name is set. Usage: Users can use a string or a string with a label. For instance ${label}_message. And the value of label must be in changes' label list. Otherwise, tag will be created with sha1's commit msg. |
fetch | string or NoneType Indicates the ref from which to get the parent commit. Defaults to push value if None |
partial_fetch | bool This is an experimental feature that only works for certain origin globs. |
integrates | sequence of git_integrate or NoneType Integrate changes from a url present in the migrated change label. Defaults to a semi-fake merge if COPYBARA_INTEGRATE_REVIEW label is present in the message |
primary_branch_migration | bool When enabled, copybara will ignore the 'push' and 'fetch' params if either is 'master' or 'main' and instead try to establish the default git branch. If this fails, it will fall back to the param's declared value. |
checker | checker or NoneType A checker that can check leaks or other checks in the commit created. |
Command line flags:
Name | Type | Description |
---|---|---|
--git-committer-email |
string | If set, overrides the committer e-mail for the generated commits in git destination. |
--git-committer-name |
string | If set, overrides the committer name for the generated commits in git destination. |
--git-destination-fetch |
string | If set, overrides the git destination fetch reference. |
--git-destination-ignore-integration-errors |
boolean | If an integration error occurs, ignore it and continue without the integrate |
--git-destination-last-rev-first-parent |
boolean | Use git --first-parent flag when looking for last-rev in previous commits |
--git-destination-non-fast-forward |
boolean | Allow non-fast-forward pushes to the destination. We only allow this when used with different push != fetch references. |
--git-destination-path |
string | If set, the tool will use this directory for the local repository. Note that if the directory exists it needs to be a git repository. Copybara will revert any staged/unstaged changes. For example, you can override destination url with a local non-bare repo (or existing empty folder) with this flag. |
--git-destination-push |
string | If set, overrides the git destination push reference. |
--git-destination-url |
string | If set, overrides the git destination URL. |
--git-skip-checker |
boolean | If true and git.destination has a configured checker, it will not be used in the migration. |
--nogit-destination-rebase |
boolean | Don't rebase the change automatically for workflows CHANGE_REQUEST mode |
Defines a feedback API endpoint for Gerrit, that exposes relevant Gerrit API operations.
endpoint_provider
git.gerrit_api(url, checker=None)
Parameter | Description |
---|---|
url | string Indicates the Gerrit repo URL. |
checker | checker or NoneType A checker for the Gerrit API transport. |
Command line flags:
Name | Type | Description |
---|---|---|
--gerrit-change-id |
string | ChangeId to use in the generated commit message. Use this flag if you want to reuse the same Gerrit review for an export. |
--gerrit-new-change |
boolean | Create a new change instead of trying to reuse an existing one. |
--gerrit-topic |
string | Gerrit topic to use |
Creates a change in Gerrit using the transformed worktree. If this is used in iterative mode, then each commit pushed in a single Copybara invocation will have the correct commit parent. The reviews generated can then be easily done in the correct order without rebasing.
destination
git.gerrit_destination(url, fetch, push_to_refs_for=fetch value, submit=False, partial_fetch=False, notify=None, change_id_policy='FAIL_IF_PRESENT', allow_empty_diff_patchset=True, reviewers=[], cc=[], labels=[], api_checker=None, integrates=None, topic=None, gerrit_submit=False, primary_branch_migration=False, checker=None)
Parameter | Description |
---|---|
url | string Indicates the URL to push to as well as the URL from which to get the parent commit |
fetch | string Indicates the ref from which to get the parent commit |
push_to_refs_for | string or NoneType Review branch to push the change to, for example setting this to 'feature_x' causes the destination to push to 'refs/for/feature_x'. It defaults to 'fetch' value. |
submit | bool If true, skip the push thru Gerrit refs/for/branch and directly push to branch. This is effectively a git.destination that sets a Change-Id |
partial_fetch | bool This is an experimental feature that only works for certain origin globs. |
notify | string or NoneType Type of Gerrit notify option (https://gerrit-review.googlesource.com/Documentation/user-upload.html#notify). Sends notifications by default. |
change_id_policy | string What to do in the presence or absent of Change-Id in message:
|
allow_empty_diff_patchset | bool By default Copybara will upload a new PatchSet to Gerrit without checking the previous one. If this set to false, Copybara will download current PatchSet and check the diff against the new diff. |
reviewers | sequence The list of the reviewers will be added to gerrit change reviewer listThe element in the list is: an email, for example: "foo@example.com" or label for example: ${SOME_GERRIT_REVIEWER}. These are under the condition of assuming that users have registered to gerrit repos |
cc | sequence The list of the email addresses or users that will be CCed in the review. Can use labels as the |
labels | sequence The list of labels to be pushed with the change. The format is the label along with the associated value. For example: Run-Presubmit+1 |
api_checker | checker or NoneType A checker for the Gerrit API endpoint provided for after_migration hooks. This field is not required if the workflow hooks don't use the origin/destination endpoints. |
integrates | sequence of git_integrate or NoneType Integrate changes from a url present in the migrated change label. Defaults to a semi-fake merge if COPYBARA_INTEGRATE_REVIEW label is present in the message |
topic | string or NoneType Sets the topic of the Gerrit change created. |
gerrit_submit | bool By default, Copybara uses git commit/push to the main branch when submit = True. If this flag is enabled, it will update the Gerrit change with the latest commit and submit using Gerrit. |
primary_branch_migration | bool When enabled, copybara will ignore the 'push_to_refs_for' and 'fetch' params if either is 'master' or 'main' and instead try to establish the default git branch. If this fails, it will fall back to the param's declared value. |
checker | checker or NoneType A checker that validates the commit files & message. If |
Command line flags:
Name | Type | Description |
---|---|---|
--git-committer-email |
string | If set, overrides the committer e-mail for the generated commits in git destination. |
--git-committer-name |
string | If set, overrides the committer name for the generated commits in git destination. |
--git-destination-fetch |
string | If set, overrides the git destination fetch reference. |
--git-destination-ignore-integration-errors |
boolean | If an integration error occurs, ignore it and continue without the integrate |
--git-destination-last-rev-first-parent |
boolean | Use git --first-parent flag when looking for last-rev in previous commits |
--git-destination-non-fast-forward |
boolean | Allow non-fast-forward pushes to the destination. We only allow this when used with different push != fetch references. |
--git-destination-path |
string | If set, the tool will use this directory for the local repository. Note that if the directory exists it needs to be a git repository. Copybara will revert any staged/unstaged changes. For example, you can override destination url with a local non-bare repo (or existing empty folder) with this flag. |
--git-destination-push |
string | If set, overrides the git destination push reference. |
--git-destination-url |
string | If set, overrides the git destination URL. |
--git-skip-checker |
boolean | If true and git.destination has a configured checker, it will not be used in the migration. |
--nogit-destination-rebase |
boolean | Don't rebase the change automatically for workflows CHANGE_REQUEST mode |
Defines a Git origin for Gerrit reviews.
Implicit labels that can be used/exposed:
- GERRIT_CHANGE_NUMBER: The change number for the Gerrit review.
- GERRIT_CHANGE_ID: The change id for the Gerrit review.
- GERRIT_CHANGE_DESCRIPTION: The description of the Gerrit review.
- COPYBARA_INTEGRATE_REVIEW: A label that when exposed, can be used to integrate automatically in the reverse workflow.
- GERRIT_CHANGE_BRANCH: The destination branch for thechange
- GERRIT_CHANGE_TOPIC: The change topic
- GERRIT_COMPLETE_CHANGE_ID: Complete Change-Id with project, branch and Change-Id
- GERRIT_OWNER_EMAIL: Owner email
- GERRIT_REVIEWER_EMAIL: Multiple value field with the email of the reviewers
- GERRIT_CC_EMAIL: Multiple value field with the email of the people/groups in cc
origin
git.gerrit_origin(url, ref=None, submodules='NO', first_parent=True, partial_fetch=False, api_checker=None, patch=None, branch=None, describe_version=None, ignore_gerrit_noop=False, primary_branch_migration=False)
Parameter | Description |
---|---|
url | string Indicates the URL of the git repository |
ref | string or NoneType DEPRECATED. Use git.origin for submitted branches. |
submodules | string Download submodules. Valid values: NO, YES, RECURSIVE. |
first_parent | bool If true, it only uses the first parent when looking for changes. Note that when disabled in ITERATIVE mode, it will try to do a migration for each change of the merged branch. |
partial_fetch | bool If true, partially fetch git repository by only fetching affected files.. |
api_checker | checker or NoneType A checker for the Gerrit API endpoint provided for after_migration hooks. This field is not required if the workflow hooks don't use the origin/destination endpoints. |
patch | transformation or NoneType Patch the checkout dir. The difference with |
branch | string or NoneType Limit the import to changes that are for this branch. By default imports everything. |
describe_version | bool or NoneType Download tags and use 'git describe' to create two labels with a meaningful version: |
ignore_gerrit_noop | bool Option to not migrate Gerrit changes that do not change origin_files |
primary_branch_migration | bool When enabled, copybara will ignore the 'ref' param if it is 'master' or 'main' and instead try to establish the default git branch. If this fails, it will fall back to the 'ref' param. |
Defines a feedback trigger based on updates on a Gerrit change.
trigger
git.gerrit_trigger(url, checker=None, events=[])
Parameter | Description |
---|---|
url | string Indicates the Gerrit repo URL. |
checker | checker or NoneType A checker for the Gerrit API transport provided by this trigger. |
events | sequence of string or dict of sequence or NoneType Types of events to monitor. Optional. Can either be a list of event types or a dict of event types to particular events of that type, e.g. |
Command line flags:
Name | Type | Description |
---|---|---|
--gerrit-change-id |
string | ChangeId to use in the generated commit message. Use this flag if you want to reuse the same Gerrit review for an export. |
--gerrit-new-change |
boolean | Create a new change instead of trying to reuse an existing one. |
--gerrit-topic |
string | Gerrit topic to use |
Defines a feedback API endpoint for GitHub, that exposes relevant GitHub API operations.
endpoint_provider
git.github_api(url, checker=None)
Parameter | Description |
---|---|
url | string Indicates the GitHub repo URL. |
checker | checker or NoneType A checker for the GitHub API transport. |
Command line flags:
Name | Type | Description |
---|---|---|
--github-destination-delete-pr-branch |
boolean | Overwrite git.github_destination delete_pr_branch field |
Creates a commit in a GitHub repository branch (for example master). For creating PullRequest use git.github_pr_destination.
destination
git.github_destination(url, push='master', fetch=None, pr_branch_to_update=None, partial_fetch=False, delete_pr_branch=False, integrates=None, api_checker=None, primary_branch_migration=False, tag_name=None, tag_msg=None, checker=None)
Parameter | Description |
---|---|
url | string Indicates the URL to push to as well as the URL from which to get the parent commit |
push | string Reference to use for pushing the change, for example 'main'. |
fetch | string or NoneType Indicates the ref from which to get the parent commit. Defaults to push value if None |
pr_branch_to_update | string or NoneType A template string that refers to a pull request branch in the same repository will be updated to current commit of this push branch only if pr_branch_to_update exists. The reason behind this field is that presubmiting changes creates and leaves a pull request open. By using this, we can automerge/close this type of pull requests. As a result, users will see this pr_branch_to_update as merged to this push branch. Usage: Users can use a string or a string with a label. For instance ${label}_pr_branch_name. And the value of label must be in changes' label list. Otherwise, nothing will happen. |
partial_fetch | bool This is an experimental feature that only works for certain origin globs. |
delete_pr_branch | bool or NoneType When |
integrates | sequence of git_integrate or NoneType Integrate changes from a url present in the migrated change label. Defaults to a semi-fake merge if COPYBARA_INTEGRATE_REVIEW label is present in the message |
api_checker | checker or NoneType A checker for the Gerrit API endpoint provided for after_migration hooks. This field is not required if the workflow hooks don't use the origin/destination endpoints. |
primary_branch_migration | bool When enabled, copybara will ignore the 'push' and 'fetch' params if either is 'master' or 'main' and instead try to establish the default git branch. If this fails, it will fall back to the param's declared value. |
tag_name | string or NoneType A template string that specifies to a tag name. If the tag already exists, copybara will only overwrite it if the --git-tag-overwrite flag is set. |
tag_msg | string or NoneType A template string that refers to the commit msg for a tag. If set, copybara willcreate an annotated tag with this custom message |
checker | checker or NoneType A checker that validates the commit files & message. If |
Command line flags:
Name | Type | Description |
---|---|---|
--git-committer-email |
string | If set, overrides the committer e-mail for the generated commits in git destination. |
--git-committer-name |
string | If set, overrides the committer name for the generated commits in git destination. |
--git-destination-fetch |
string | If set, overrides the git destination fetch reference. |
--git-destination-ignore-integration-errors |
boolean | If an integration error occurs, ignore it and continue without the integrate |
--git-destination-last-rev-first-parent |
boolean | Use git --first-parent flag when looking for last-rev in previous commits |
--git-destination-non-fast-forward |
boolean | Allow non-fast-forward pushes to the destination. We only allow this when used with different push != fetch references. |
--git-destination-path |
string | If set, the tool will use this directory for the local repository. Note that if the directory exists it needs to be a git repository. Copybara will revert any staged/unstaged changes. For example, you can override destination url with a local non-bare repo (or existing empty folder) with this flag. |
--git-destination-push |
string | If set, overrides the git destination push reference. |
--git-destination-url |
string | If set, overrides the git destination URL. |
--git-skip-checker |
boolean | If true and git.destination has a configured checker, it will not be used in the migration. |
--nogit-destination-rebase |
boolean | Don't rebase the change automatically for workflows CHANGE_REQUEST mode |
Defines a Git origin for a Github repository. This origin should be used for public branches. Use github_pr_origin for importing Pull Requests.
origin
git.github_origin(url, ref=None, submodules='NO', first_parent=True, partial_fetch=False, patch=None, describe_version=None, version_selector=None, primary_branch_migration=False)
Parameter | Description |
---|---|
url | string Indicates the URL of the git repository |
ref | string or NoneType Represents the default reference that will be used for reading the revision from the git repository. For example: 'master' |
submodules | string Download submodules. Valid values: NO, YES, RECURSIVE. |
first_parent | bool If true, it only uses the first parent when looking for changes. Note that when disabled in ITERATIVE mode, it will try to do a migration for each change of the merged branch. |
partial_fetch | bool If true, partially fetch git repository by only fetching affected files. |
patch | transformation or NoneType Patch the checkout dir. The difference with |
describe_version | bool or NoneType Download tags and use 'git describe' to create two labels with a meaningful version: |
version_selector | VersionSelector or NoneType Select a custom version (tag)to migrate instead of 'ref'. Version selector is expected to match the whole refspec (e.g. 'refs/heads/${n1}') |
primary_branch_migration | bool When enabled, copybara will ignore the 'ref' param if it is 'master' or 'main' and instead try to establish the default git branch. If this fails, it will fall back to the 'ref' param. |
Creates changes in a new pull request in the destination.
destination
git.github_pr_destination(url, destination_ref='master', pr_branch=None, partial_fetch=False, allow_empty_diff=True, title=None, body=None, integrates=None, api_checker=None, update_description=False, primary_branch_migration=False, checker=None)
Parameter | Description |
---|---|
url | string Url of the GitHub project. For example "https://github.com/google/copybara'" |
destination_ref | string Destination reference for the change. |
pr_branch | string or NoneType Customize the pull request branch. Any variable present in the message in the form of ${CONTEXT_REFERENCE} will be replaced by the corresponding stable reference (head, PR number, Gerrit change number, etc.). |
partial_fetch | bool This is an experimental feature that only works for certain origin globs. |
allow_empty_diff | bool By default, copybara migrates changes without checking existing PRs. If set, copybara will skip pushing a change to an existing PR only if the git three of the pending migrating change is the same as the existing PR. |
title | string or NoneType When creating (or updating if |
body | string or NoneType When creating (or updating if |
integrates | sequence of git_integrate or NoneType Integrate changes from a url present in the migrated change label. Defaults to a semi-fake merge if COPYBARA_INTEGRATE_REVIEW label is present in the message |
api_checker | checker or NoneType A checker for the GitHub API endpoint provided for after_migration hooks. This field is not required if the workflow hooks don't use the origin/destination endpoints. |
update_description | bool By default, Copybara only set the title and body of the PR when creating the PR. If this field is set to true, it will update those fields for every update. |
primary_branch_migration | bool When enabled, copybara will ignore the 'desination_ref' param if it is 'master' or 'main' and instead try to establish the default git branch. If this fails, it will fall back to the param's declared value. |
checker | checker or NoneType A checker that validates the commit files & message. If |
Create a branch by using copybara's computerIdentity algorithm:
git.github_pr_destination(
url = "https://github.com/google/copybara",
destination_ref = "master",
)
Customize pr_branch with context reference:
git.github_pr_destination(
url = "https://github.com/google/copybara",
destination_ref = "master",
pr_branch = 'test_${CONTEXT_REFERENCE}',
)
Customize pr_branch with a constant string:
git.github_pr_destination(
url = "https://github.com/google/copybara",
destination_ref = "master",
pr_branch = 'test_my_branch',
)
Command line flags:
Name | Type | Description |
---|---|---|
--git-committer-email |
string | If set, overrides the committer e-mail for the generated commits in git destination. |
--git-committer-name |
string | If set, overrides the committer name for the generated commits in git destination. |
--git-destination-fetch |
string | If set, overrides the git destination fetch reference. |
--git-destination-ignore-integration-errors |
boolean | If an integration error occurs, ignore it and continue without the integrate |
--git-destination-last-rev-first-parent |
boolean | Use git --first-parent flag when looking for last-rev in previous commits |
--git-destination-non-fast-forward |
boolean | Allow non-fast-forward pushes to the destination. We only allow this when used with different push != fetch references. |
--git-destination-path |
string | If set, the tool will use this directory for the local repository. Note that if the directory exists it needs to be a git repository. Copybara will revert any staged/unstaged changes. For example, you can override destination url with a local non-bare repo (or existing empty folder) with this flag. |
--git-destination-push |
string | If set, overrides the git destination push reference. |
--git-destination-url |
string | If set, overrides the git destination URL. |
--git-skip-checker |
boolean | If true and git.destination has a configured checker, it will not be used in the migration. |
--github-destination-pr-branch |
string | If set, uses this branch for creating the pull request instead of using a generated one |
--github-destination-pr-create |
boolean | If the pull request should be created |
--nogit-destination-rebase |
boolean | Don't rebase the change automatically for workflows CHANGE_REQUEST mode |
Defines a Git origin for Github pull requests.
Implicit labels that can be used/exposed:
- GITHUB_PR_NUMBER: The pull request number if the reference passed was in the form of
https://github.com/project/pull/123
,refs/pull/123/head
orrefs/pull/123/master
. - COPYBARA_INTEGRATE_REVIEW: A label that when exposed, can be used to integrate automatically in the reverse workflow.
- GITHUB_BASE_BRANCH: The name of the branch which serves as the base for the Pull Request.
- GITHUB_BASE_BRANCH_SHA1: The SHA-1 of the commit used as baseline. Generally, the baseline commit is the point of divergence between the PR's 'base' and 'head' branches. When
use_merge = True
is specified, the baseline is instead the tip of the PR's base branch. - GITHUB_PR_USE_MERGE: Equal to 'true' if the workflow is importing a GitHub PR 'merge' commit and 'false' when importing a GitHub PR 'head' commit.
- GITHUB_PR_TITLE: Title of the Pull Request.
- GITHUB_PR_BODY: Body of the Pull Request.
- GITHUB_PR_URL: GitHub url of the Pull Request.
- GITHUB_PR_HEAD_SHA: The SHA-1 of the head commit of the pull request.
- GITHUB_PR_USER: The login of the author the pull request.
- GITHUB_PR_ASSIGNEE: A repeated label with the login of the assigned users.
- GITHUB_PR_REVIEWER_APPROVER: A repeated label with the login of users that have participated in the review and that can approve the import. Only populated if
review_state
field is set. Every reviewers type matchingreview_approvers
will be added to this list. - GITHUB_PR_REVIEWER_OTHER: A repeated label with the login of users that have participated in the review but cannot approve the import. Only populated if
review_state
field is set.
origin
git.github_pr_origin(url, use_merge=False, required_labels=[], required_status_context_names=[], required_check_runs=[], retryable_labels=[], submodules='NO', baseline_from_branch=False, first_parent=True, partial_fetch=False, state='OPEN', review_state=None, review_approvers=["COLLABORATOR", "MEMBER", "OWNER"], api_checker=None, patch=None, branch=None, describe_version=None)
Parameter | Description |
---|---|
url | string Indicates the URL of the GitHub repository |
use_merge | bool If the content for refs/pull/<ID>/merge should be used instead of the PR head. The GitOrigin-RevId still will be the one from refs/pull/<ID>/head revision. |
required_labels | sequence of string Required labels to import the PR. All the labels need to be present in order to migrate the Pull Request. |
required_status_context_names | sequence of string A list of names of services which must all mark the PR with 'success' before it can be imported. |
required_check_runs | sequence of string A list of check runs which must all have a value of 'success' in order to import the PR. |
retryable_labels | sequence of string Required labels to import the PR that should be retried. This parameter must be a subset of required_labels. |
submodules | string Download submodules. Valid values: NO, YES, RECURSIVE. |
baseline_from_branch | bool WARNING: Use this field only for github -> git CHANGE_REQUEST workflows. |
first_parent | bool If true, it only uses the first parent when looking for changes. Note that when disabled in ITERATIVE mode, it will try to do a migration for each change of the merged branch. |
partial_fetch | bool This is an experimental feature that only works for certain origin globs. |
state | string Only migrate Pull Request with that state. Possible values: |
review_state | string or NoneType Required state of the reviews associated with the Pull Request Possible values: |
review_approvers | sequence of string or NoneType The set of reviewer types that are considered for approvals. In order to have any effect, |
api_checker | checker or NoneType A checker for the GitHub API endpoint provided for after_migration hooks. This field is not required if the workflow hooks don't use the origin/destination endpoints. |
patch | transformation or NoneType Patch the checkout dir. The difference with |
branch | string or NoneType If set, it will only migrate pull requests for this base branch |
describe_version | bool or NoneType Download tags and use 'git describe' to create two labels with a meaningful version: |
Command line flags:
Name | Type | Description |
---|---|---|
--github-force-import |
boolean | Force import regardless of the state of the PR |
--github-pr-merge |
boolean | Override merge bit from config |
--github-required-check-run |
list | Required check runs in the Pull Request to be imported by github_pr_origin |
--github-required-label |
list | Required labels in the Pull Request to be imported by github_pr_origin |
--github-required-status-context-name |
list | Required status context names in the Pull Request to be imported by github_pr_origin |
--github-retryable-label |
list | Required labels in the Pull Request that should be retryed to be imported by github_pr_origin |
--github-skip-required-check-runs |
boolean | Skip checking check runs for importing Pull Requests. Note that this is dangerous as it might import an unsafe PR. |
--github-skip-required-labels |
boolean | Skip checking labels for importing Pull Requests. Note that this is dangerous as it might import an unsafe PR. |
--github-skip-required-status-context-names |
boolean | Skip checking status context names for importing Pull Requests. Note that this is dangerous as it might import an unsafe PR. |
Defines a feedback trigger based on updates on a GitHub PR.
trigger
git.github_trigger(url, checker=None, events=[])
Parameter | Description |
---|---|
url | string Indicates the GitHub repo URL. |
checker | checker or NoneType A checker for the GitHub API transport provided by this trigger. |
events | sequence of string or dict of sequence Types of events to subscribe. Can either be a list of event types or a dict of event types to particular events of that type, e.g. |
Command line flags:
Name | Type | Description |
---|---|---|
--github-destination-delete-pr-branch |
boolean | Overwrite git.github_destination delete_pr_branch field |
Integrate changes from a url present in the migrated change label.
git_integrate
git.integrate(label="COPYBARA_INTEGRATE_REVIEW", strategy="FAKE_MERGE_AND_INCLUDE_FILES", ignore_errors=True)
Parameter | Description |
---|---|
label | string The migration label that will contain the url to the change to integrate. |
strategy | string How to integrate the change:
|
ignore_errors | bool If we should ignore integrate errors and continue the migration without the integrate |
Assuming we have a git.destination defined like this:
git.destination(
url = "https://example.com/some_git_repo",
integrates = [git.integrate()],
)
It will look for COPYBARA_INTEGRATE_REVIEW
label during the worklow migration. If the label is found, it will fetch the git url and add that change as an additional parent to the migration commit (merge). It will fake-merge any change from the url that matches destination_files but it will include changes not matching it.
DEPRECATED: Use core.latest_version.
Customize what version of the available branches and tags to pick. By default it ignores the reference passed as parameter. Using --force in the CLI will force to use the reference passed as argument instead.
VersionSelector
git.latest_version(refspec_format="refs/tags/${n0}.${n1}.${n2}", refspec_groups={'n0' : '[0-9]+', 'n1' : '[0-9]+', 'n2' : '[0-9]+'})
Parameter | Description |
---|---|
refspec_format | string The format of the branch/tag |
refspec_groups | dict A set of named regexes that can be used to match part of the versions. Copybara uses re2 syntax. Use the following nomenclature n0, n1, n2 for the version part (will use numeric sorting) or s0, s1, s2 (alphabetic sorting). Note that there can be mixed but the numbers cannot be repeated. In other words n0, s1, n2 is valid but not n0, s0, n1. n0 has more priority than n1. If there are fields where order is not important, use s(N+1) where N ist he latest sorted field. Example {"n0": "[0-9]+", "s1": "[a-z]+"} |
Mirror git references between repositories
git.mirror(name, origin, destination, refspecs=['refs/heads/*'], prune=False, partial_fetch=False, description=None, actions=[])
Parameter | Description |
---|---|
name | string Migration name |
origin | string Indicates the URL of the origin git repository |
destination | string Indicates the URL of the destination git repository |
refspecs | sequence of string Represents a list of git refspecs to mirror between origin and destination. For example 'refs/heads/:refs/remotes/origin/' will mirror any reference inside refs/heads to refs/remotes/origin. |
prune | bool Remove remote refs that don't have a origin counterpart. Prune is ignored if actions are used (Action is in charge of doing the pruning) |
partial_fetch | bool This is an experimental feature that only works for certain origin globs. |
description | string or NoneType A description of what this migration achieves |
actions | sequence Experimental feature. A list of mirror actions to perform, with the following semantics: |
Defines a standard Git origin. For Git specific origins use: github_origin
or gerrit_origin
.
All the origins in this module accept several string formats as reference (When copybara is called in the form of copybara config workflow reference
):
- Branch name: For example
master
- An arbitrary reference:
refs/changes/20/50820/1
- A SHA-1: Note that it has to be reachable from the default refspec
- A Git repository URL and reference:
http://github.com/foo master
- A GitHub pull request URL:
https://github.com/some_project/pull/1784
So for example, Copybara can be invoked for a
git.origin
in the CLI as:copybara copy.bara.sky my_workflow https://github.com/some_project/pull/1784
This will use the pull request as the origin URL and reference.
origin
git.origin(url, ref=None, submodules='NO', include_branch_commit_logs=False, first_parent=True, partial_fetch=False, patch=None, describe_version=None, version_selector=None, primary_branch_migration=False)
Parameter | Description |
---|---|
url | string Indicates the URL of the git repository |
ref | string or NoneType Represents the default reference that will be used for reading the revision from the git repository. For example: 'master' |
submodules | string Download submodules. Valid values: NO, YES, RECURSIVE. |
include_branch_commit_logs | bool Whether to include raw logs of branch commits in the migrated change message.WARNING: This field is deprecated in favor of 'first_parent' one. This setting only affects merge commits. |
first_parent | bool If true, it only uses the first parent when looking for changes. Note that when disabled in ITERATIVE mode, it will try to do a migration for each change of the merged branch. |
partial_fetch | bool If true, partially fetch git repository by only fetching affected files. |
patch | transformation or NoneType Patch the checkout dir. The difference with |
describe_version | bool or NoneType Download tags and use 'git describe' to create two labels with a meaningful version: |
version_selector | VersionSelector or NoneType Select a custom version (tag)to migrate instead of 'ref'. Version selector is expected to match the whole refspec (e.g. 'refs/heads/${n1}') |
primary_branch_migration | bool When enabled, copybara will ignore the 'ref' param if it is 'master' or 'main' and instead try to establish the default git branch. If this fails, it will fall back to the 'ref' param. |
Creates a review to be posted on Gerrit.
SetReviewInput
git.review_input(labels={}, message=None, tag=None)
Parameter | Description |
---|---|
labels | dict The labels to post. |
message | string or NoneType The message to be added as review comment. |
tag | string or NoneType Tag to be applied to the review, for instance 'autogenerated:copybara'. |
Command line flags:
Name | Type | Description |
---|---|---|
--gerrit-change-id |
string | ChangeId to use in the generated commit message. Use this flag if you want to reuse the same Gerrit review for an export. |
--gerrit-new-change |
boolean | Create a new change instead of trying to reuse an existing one. |
--gerrit-topic |
string | Gerrit topic to use |
Expose methods to git.mirror
actions to perform operations over git repositories
Name | Description |
---|---|
action_name | string The name of the current action. |
cli_labels | dict[string, string] Access labels that a user passes through flag '--labels'. For example: --labels=foo:value1,bar:value2. Then it can access in this way:cli_labels['foo']. |
console | Console Get an instance of the console to report errors or warnings |
params | dict Parameters for the function if created with core.action |
refs | sequence A list containing string representations of the entities that triggered the event |
Cherry-pick one or more commits to a branch
git_merge_result
git.mirrorContext.cherry_pick(branch, commits, add_commit_origin_info=True, merge_parent_number=None, allow_empty=False, fast_forward=False)
Parameter | Description |
---|---|
branch | string |
commits | sequence of string Commits to cherry-pick. An expression like foo..bar can be used to cherry-pick several commits. Note that 'HEAD' will refer to the |
add_commit_origin_info | bool Add information about the origin of the commit (sha-1) to the message of the newcommit |
merge_parent_number | unknown Specify the parent number for cherry-picking merge commits |
allow_empty | bool Allow empty commits (noop commits) |
fast_forward | bool Fast-forward commits if possible |
Merge one or more commits into a local branch.
git.mirrorContext.create_branch(name, starting_point=None)
Parameter | Description |
---|---|
name | string |
starting_point | unknown |
Fetch from the destination a list of refspecs. Note that fetch happens without pruning.
bool
git.mirrorContext.destination_fetch(refspec, prune=True)
Parameter | Description |
---|---|
refspec | sequence of string |
prune | bool |
Push to the destination a list of refspecs.
git.mirrorContext.destination_push(refspec, prune=False)
Parameter | Description |
---|---|
refspec | sequence of string |
prune | bool |
Returns an error action result.
dynamic.action_result
git.mirrorContext.error(msg)
Parameter | Description |
---|---|
msg | string The error message |
Merge one or more commits into a local branch.
git_merge_result
git.mirrorContext.merge(branch, commits, msg=None, fast_forward="FF")
Parameter | Description |
---|---|
branch | string |
commits | sequence of string |
msg | unknown |
fast_forward | string Valid values are FF (default), NO_FF, FF_ONLY. |
Returns a no op action result with an optional message.
dynamic.action_result
git.mirrorContext.noop(msg=None)
Parameter | Description |
---|---|
msg | string or NoneType The no op message |
Fetch from the origin a list of refspecs. Note that fetch happens without pruning.
bool
git.mirrorContext.origin_fetch(refspec, prune=True)
Parameter | Description |
---|---|
refspec | sequence of string |
prune | bool |
Rebase one or more commits into a local branch.
git_merge_result
git.mirrorContext.rebase(upstream, branch, newBase=None, conflict_advice=None)
Parameter | Description |
---|---|
upstream | string upstream branch with new changes |
branch | string Current branch with specific commits that we want to rebase in top of the new |
newBase | unknown Move the rebased changes to a new branch (--into parameter in git rebase) |
conflict_advice | unknown Additional information on how to solve the issue in case if conflict |
Records an effect of the current action.
git.mirrorContext.record_effect(summary, origin_refs, destination_ref, errors=[], type="UPDATED")
Parameter | Description |
---|---|
summary | string The summary of this effect |
origin_refs | sequence of origin_ref The origin refs |
destination_ref | destination_ref The destination ref |
errors | sequence of string An optional list of errors |
type | string The type of migration effect:
|
Return a map of reference -> sha-1 for local references matching the refspec or all if no refspec is passed.
dict[string, string]
git.mirrorContext.references(refspec=[])
Parameter | Description |
---|---|
refspec | sequence of string |
Returns a successful action result.
dynamic.action_result
git.mirrorContext.success()
The result returned by git merge when used in Starlark. For example in git.mirror dynamic actions.
Name | Description |
---|---|
error | bool True if the merge execution resulted in an error. False otherwise |
error_msg | string Error message from git if the merge resulted in a conflict/error. Users must check error field before accessing this field. |
GitHub API endpoint implementation for feedback migrations and after migration hooks.
Name | Description |
---|---|
url | string Return the URL of this endpoint. |
Add labels to a PR/issue
github_api_obj.add_label(number, labels)
Parameter | Description |
---|---|
number | int Pull Request number |
labels | sequence of string List of labels to add. |
Create a new issue.
Issue
github_api_obj.create_issue(title, body, assignees)
Parameter | Description |
---|---|
title | string Title of the issue |
body | string Body of the issue. |
assignees | sequence GitHub users to whom the issue will be assigned. |
Create or update a status for a commit. Returns the status created.
github_api_status_obj
github_api_obj.create_status(sha, state, context, description, target_url=None)
Parameter | Description |
---|---|
sha | string The SHA-1 for which we want to create or update the status |
state | string The state of the commit status: 'success', 'error', 'pending' or 'failure' |
context | string The context for the commit status. Use a value like 'copybara/import_successful' or similar |
description | string Description about what happened |
target_url | string or NoneType Url with expanded information about the event |
Delete a reference.
github_api_obj.delete_reference(ref)
Parameter | Description |
---|---|
ref | string The name of the reference. |
Get autenticated user info, return null if not found
github_api_user_obj
github_api_obj.get_authenticated_user()
Get the list of check runs for a sha. https://developer.github.com/v3/checks/runs/#check-runs
github_check_runs_obj
github_api_obj.get_check_runs(sha)
Parameter | Description |
---|---|
sha | string The SHA-1 for which we want to get the check runs |
Get the combined status for a commit. Returns None if not found.
github_api_combined_status_obj
github_api_obj.get_combined_status(ref)
Parameter | Description |
---|---|
ref | string The SHA-1 or ref for which we want to get the combined status |
Get information for a commit in GitHub. Returns None if not found.
github_api_github_commit_obj
github_api_obj.get_commit(ref)
Parameter | Description |
---|---|
ref | string The SHA-1 for which we want to get the combined status |
Get a pull request comment
github_api_pull_request_comment_obj
github_api_obj.get_pull_request_comment(comment_id)
Parameter | Description |
---|---|
comment_id | string Comment identifier |
Get all pull request comments
sequence of github_api_pull_request_comment_obj
github_api_obj.get_pull_request_comments(number)
Parameter | Description |
---|---|
number | int Pull Request number |
Get Pull Requests for a repo
sequence of github_api_pull_request_obj
github_api_obj.get_pull_requests(head_prefix=None, base_prefix=None, state="OPEN", sort="CREATED", direction="ASC")
Parameter | Description |
---|---|
head_prefix | string or NoneType Only return PRs wher the branch name has head_prefix |
base_prefix | string or NoneType Only return PRs where the destination branch name has base_prefix |
state | string State of the Pull Request. Can be |
sort | string Sort filter for retrieving the Pull Requests. Can be |
direction | string Direction of the filter. Can be |
Get a reference SHA-1 from GitHub. Returns None if not found.
github_api_ref_obj
github_api_obj.get_reference(ref)
Parameter | Description |
---|---|
ref | string The name of the reference. For example: "refs/heads/branchName". |
Get all the reference SHA-1s from GitHub. Note that Copybara only returns a maximum number of 500.
sequence of github_api_ref_obj
github_api_obj.get_references()
Creates a new destination reference out of this endpoint.
destination_ref
github_api_obj.new_destination_ref(ref, type, url=None)
Parameter | Description |
---|---|
ref | string The reference. |
type | string The type of this reference. |
url | string or NoneType The url associated with this reference, if any. |
Creates a new origin reference out of this endpoint.
origin_ref
github_api_obj.new_origin_ref(ref)
Parameter | Description |
---|---|
ref | string The reference. |
Post a comment on a issue.
github_api_obj.post_issue_comment(number, comment)
Parameter | Description |
---|---|
number | int Issue or Pull Request number |
comment | string Comment body to post. |
Update Pull Requests for a repo. Returns None if not found
github_api_pull_request_obj
github_api_obj.update_pull_request(number, title=None, body=None, state=None)
Parameter | Description |
---|---|
number | int Pull Request number |
title | string or NoneType New Pull Request title |
body | string or NoneType New Pull Request body |
state | string or NoneType State of the Pull Request. Can be |
Update a reference to point to a new commit. Returns the info of the reference.
github_api_ref_obj
github_api_obj.update_reference(ref, sha, force)
Parameter | Description |
---|---|
ref | string The name of the reference. |
sha | string The id for the commit status. |
force | bool Indicates whether to force the update or to make sure the update is a fast-forward update. Leaving this out or setting it to false will make sure you're not overwriting work. Default: false |
A glob represents a set of relative filepaths in the Copybara workdir.
Global functions available in Copybara
Returns an object which matches every file in the workdir that matches at least one pattern in include and does not match any of the patterns in exclude.
glob
glob(include, exclude=[])
Parameter | Description |
---|---|
include | sequence of string The list of glob patterns to include |
exclude | sequence of string The list of glob patterns to exclude |
Include all the files under a folder except for internal
folder files:
glob(["foo/**"], exclude = ["foo/internal/**"])
Globs can have multiple inclusive rules:
glob(["foo/**", "bar/**", "baz/**.java"])
This will include all files inside foo
and bar
folders and Java files inside baz
folder.
Globs can have multiple exclusive rules:
glob(["foo/**"], exclude = ["foo/internal/**", "foo/confidential/**" ])
Include all the files of foo
except the ones in internal
and confidential
folders
Copybara uses Java globbing. The globbing is very similar to Bash one. This means that recursive globbing for a filename is a bit more tricky:
glob(["BUILD", "**/BUILD"])
This is the correct way of matching all BUILD
files recursively, including the one in the root. **/BUILD
would only match BUILD
files in subdirectories.
While two globs can be used for matching two directories, there is a more compact approach:
glob(["{java,javatests}/**"])
This matches any file in java
and javatests
folders.
This is useful when you want to exclude a broad subset of files but you want to still include some of those files.
glob(["folder/**"], exclude = ["folder/**.excluded"]) + glob(['folder/includeme.excluded'])
This matches all the files in folder
, excludes all files in that folder that ends with .excluded
but keeps folder/includeme.excluded
+
operator for globs is equivalent to OR
operation.
This is another way to exclude a broad subset of files, but still include some of those files.
glob(["folder/**"]) - glob(["folder/**.excluded"], exclude=["folder/includeme.excluded"])
This matches the same file as in the previous example.-
operator for globs is equivalent to a set difference operation.
Create a new author from a string with the form 'name foo@bar.com'
author
new_author(author_string)
Parameter | Description |
---|---|
author_string | string A string representation of the author with the form 'name foo@bar.com' |
new_author('Foo Bar <foobar@myorg.com>')
Returns a ChangeMessage parsed from a well formed string.
ChangeMessage
parse_message(message)
Parameter | Description |
---|---|
message | string The contents of the change message |
Set of functions to define Mercurial (Hg) origins and destinations.
EXPERIMENTAL: Defines a standard Mercurial (Hg) origin.
origin
hg.origin(url, ref="default")
Parameter | Description |
---|---|
url | string Indicates the URL of the Hg repository |
ref | string Represents the default reference that will be used to read a revision from the repository. The reference defaults to
|
A function that given an object can map to another object
Core transformations for the change metadata
Adds a header line to the commit message. Any variable present in the message in the form of ${LABEL_NAME} will be replaced by the corresponding label in the message. Note that this requires that the label is already in the message or in any of the changes being imported. The label in the message takes priority over the ones in the list of original messages of changes imported.
transformation
metadata.add_header(text, ignore_label_not_found=False, new_line=True)
Parameter | Description |
---|---|
text |
string The header text to include in the message. For example '[Import of foo ${LABEL}]'. This would construct a message resolving ${LABEL} to the corresponding label. |
ignore_label_not_found |
bool If a label used in the template is not found, ignore the error and don't add the header. By default it will stop the migration and fail. |
new_line |
bool If a new line should be added between the header and the original message. This allows to create messages like |
Adds a header to any message
metadata.add_header("COPYBARA CHANGE")
Messages like:
A change
Example description for
documentation
Will be transformed into:
COPYBARA CHANGE
A change
Example description for
documentation
Adds a header to messages that contain a label. Otherwise it skips the message manipulation.
metadata.add_header("COPYBARA CHANGE FOR https://github.com/myproject/foo/pull/${GITHUB_PR_NUMBER}",
ignore_label_not_found = True,
)
A change message, imported using git.github_pr_origin, like:
A change
Example description for
documentation
Will be transformed into:
COPYBARA CHANGE FOR https://github.com/myproject/foo/pull/1234
Example description for
documentation
Assuming the PR number is 1234. But any change without that label will not be transformed.
Adds a header without adding a new line before the original message:
metadata.add_header("COPYBARA CHANGE: ", new_line = False)
Messages like:
A change
Example description for
documentation
Will be transformed into:
COPYBARA CHANGE: A change
Example description for
documentation
Certain labels are present in the internal metadata but are not exposed in the message by default. This transformations find a label in the internal metadata and exposes it in the message. If the label is already present in the message it will update it to use the new name and separator.
transformation
metadata.expose_label(name, new_name=label, separator="=", ignore_label_not_found=True, all=False, concat_separator=None)
Parameter | Description |
---|---|
name | string The label to search |
new_name | string or NoneType The name to use in the message |
separator | string The separator to use when adding the label to the message |
ignore_label_not_found | bool If a label is not found, ignore the error and continue. |
all | bool By default Copybara tries to find the most relevant instance of the label. First looking into the message and then looking into the changes in order. If this field is true it exposes all the matches instead. |
concat_separator | unknown If all is set, copybara will expose multiple values in one per line. If a separator is specified, it will concat the values instead. |
Expose a hidden label called 'REVIEW_URL':
metadata.expose_label('REVIEW_URL')
This would add it as REVIEW_URL=the_value
.
Expose a hidden label called 'REVIEW_URL' as GIT_REVIEW_URL:
metadata.expose_label('REVIEW_URL', 'GIT_REVIEW_URL')
This would add it as GIT_REVIEW_URL=the_value
.
Expose the label with a custom separator
metadata.expose_label('REVIEW_URL', separator = ': ')
This would add it as REVIEW_URL: the_value
.
Expose all instances of a label in all the changes (SQUASH for example)
metadata.expose_label('REVIEW_URL', all = True)
This would add 0 or more REVIEW_URL: the_value
labels to the message.
Expose all instances of a label in all the changes (SQUASH for example)
metadata.expose_label('REVIEW_URL', all = True, concat_separator=',')
This would add a REVIEW_URL: value1,value2
label to the message.
Map the author name and mail to another author. The mapping can be done by both name and mail or only using any of the two.
transformation
metadata.map_author(authors, reversible=False, noop_reverse=False, fail_if_not_found=False, reverse_fail_if_not_found=False, map_all_changes=False)
Parameter | Description |
---|---|
authors | dict The author mapping. Keys can be in the form of 'Your Name', 'some@mail' or 'Your Name <some@mail>'. The mapping applies heuristics to know which field to use in the mapping. The value has to be always in the form of 'Your Name <some@mail>' |
reversible | bool If the transform is automatically reversible. Workflows using the reverse of this transform will be able to automatically map values to keys. |
noop_reverse | bool If true, the reversal of the transformation doesn't do anything. This is useful to avoid having to write |
fail_if_not_found | bool Fail if a mapping cannot be found. Helps discovering early authors that should be in the map |
reverse_fail_if_not_found | bool Same as fail_if_not_found but when the transform is used in a inverse workflow. |
map_all_changes | bool If all changes being migrated should be mapped. Useful for getting a mapped metadata.squash_notes. By default we only map the current author. |
Here we show how to map authors using different options:
metadata.map_author({
'john' : 'Some Person <some@example.com>',
'madeupexample@google.com' : 'Other Person <someone@example.com>',
'John Example <john.example@example.com>' : 'Another Person <some@email.com>',
})
Allows updating links to references in commit messages to match the destination's format. Note that this will only consider the 5000 latest commits.
transformation
metadata.map_references(before, after, regex_groups={}, additional_import_labels=[])
Parameter | Description |
---|---|
before |
string Template for origin references in the change message. Use a '${reference}' token to capture the actual references. E.g. if the origin uses links like 'http://changes?1234', the template would be 'http://changes?${reference}', with reference_regex = '[0-9]+' |
after |
string Format for destination references in the change message. Use a '${reference}' token to represent the destination reference. E.g. if the destination uses links like 'http://changes?1234', the template would be 'http://changes?${reference}', with reference_regex = '[0-9]+' |
regex_groups |
dict Regexes for the ${reference} token's content. Requires one 'before_ref' entry matching the ${reference} token's content on the before side. Optionally accepts one 'after_ref' used for validation. Copybara uses re2 syntax. |
additional_import_labels |
sequence of string Meant to be used when migrating from another tool: Per default, copybara will only recognize the labels defined in the workflow's endpoints. The tool will use these additional labels to find labels created by other invocations and tools. |
Finds links to commits in change messages, searches destination to find the equivalent reference in destination. Then replaces matches of 'before' with 'after', replacing the subgroup matched with the destination reference. Assume a message like 'Fixes bug introduced in origin/abcdef', where the origin change 'abcdef' was migrated as '123456' to the destination.
metadata.map_references(
before = "origin/${reference}",
after = "destination/${reference}",
regex_groups = {
"before_ref": "[0-9a-f]+",
"after_ref": "[0-9]+",
},
)
This would be translated into 'Fixes bug introduced in destination/123456', provided that a change with the proper label was found - the message remains unchanged otherwise.
Remove a label from the message
transformation
metadata.remove_label(name)
Parameter | Description |
---|---|
name | string The label name |
Remove Change-Id label from the message:
metadata.remove_label('Change-Id')
Replace the change message with a template text. Any variable present in the message in the form of ${LABEL_NAME} will be replaced by the corresponding label in the message. Note that this requires that the label is already in the message or in any of the changes being imported. The label in the message takes priority over the ones in the list of original messages of changes imported.
transformation
metadata.replace_message(text, ignore_label_not_found=False)
Parameter | Description |
---|---|
text |
string The template text to use for the message. For example '[Import of foo ${LABEL}]'. This would construct a message resolving ${LABEL} to the corresponding label. |
ignore_label_not_found |
bool If a label used in the template is not found, ignore the error and don't add the header. By default it will stop the migration and fail. |
Replace the original message with a text:
metadata.replace_message("COPYBARA CHANGE: Import of ${GITHUB_PR_NUMBER}\n\n${GITHUB_PR_BODY}\n")
Will transform the message to:
COPYBARA CHANGE: Import of 12345
Body from Github Pull Request
For a given change, restore the author present in the ORIGINAL_AUTHOR label as the author of the change.
transformation
metadata.restore_author(label='ORIGINAL_AUTHOR', separator="=", search_all_changes=False)
Parameter | Description |
---|---|
label | string The label to use for restoring the author |
separator | string The separator to use between the label and the value |
search_all_changes | bool By default Copybara only looks in the last current change for the author label. This allows to do the search in all current changes (Only makes sense for SQUASH/CHANGE_REQUEST). |
For a given change, store a copy of the author as a label with the name ORIGINAL_AUTHOR.
transformation
metadata.save_author(label='ORIGINAL_AUTHOR', separator="=")
Parameter | Description |
---|---|
label | string The label to use for storing the author |
separator | string The separator to use between the label and the value |
Removes part of the change message using a regex
transformation
metadata.scrubber(regex, msg_if_no_match=None, fail_if_no_match=False, replacement='')
Parameter | Description |
---|---|
regex |
string Any text matching the regex will be removed. Note that the regex is runs in multiline mode. |
msg_if_no_match |
string or NoneType If set, Copybara will use this text when the scrubbing regex doesn't match. |
fail_if_no_match |
bool If set, msg_if_no_match must be None and then fail if the scrubbing regex doesn't match. |
replacement |
string Text replacement for the matching substrings. References to regex group numbers can be used in the form of $1, $2, etc. |
When change messages are in the following format:
Public change description
This is a public description for a commit
CONFIDENTIAL:
This fixes internal project foo-bar
Using the following transformation:
metadata.scrubber('(^|\n)CONFIDENTIAL:(.|\n)*')
Will remove the confidential part, leaving the message as:
Public change description
This is a public description for a commit
The previous example is prone to leak confidential information since a developer could easily forget to include the CONFIDENTIAL label. A different approach for this is to scrub everything by default except what is explicitly allowed. For example, the following scrubber would remove anything not enclosed in <public></public> tags:
metadata.scrubber('^(?:\n|.)*<public>((?:\n|.)*)</public>(?:\n|.)*$', replacement = '$1')
So a message like:
this
is
very confidential<public>but this is public
very public
</public>
and this is a secret too
would be transformed into:
but this is public
very public
Assign msg_if_no_match a default msg. For example:
metadata.scrubber('^(?:\n|.)*<public>((?:\n|.)*)</public>(?:\n|.)*$', msg_if_no_match = 'Internal Change.', replacement = '$1')
So a message like:
this
is
very confidential
This is not public msg.
and this is a secret too
would be transformed into:
Internal Change.
Set fail_if_no_match to true
metadata.scrubber('^(?:\n|.)*<public>((?:\n|.)*)</public>(?:\n|.)*$', fail_if_no_match = True, replacement = '$1')
So a message like:
this
is
very confidential
but this is not public
and this is a secret too
This would fail. Error msg:
Scrubber regex: '^(?:\n|.)*<public>((?:\n|.)*)</public>(?:\n|.)*$' didn't match for description: this
is
very confidential
but this is not public
and this is a secret too
Generate a message that includes a constant prefix text and a list of changes included in the squash change.
transformation
metadata.squash_notes(prefix='Copybara import of the project:\n\n', max=100, compact=True, show_ref=True, show_author=True, show_description=True, oldest_first=False, use_merge=True)
Parameter | Description |
---|---|
prefix | string A prefix to be printed before the list of commits. |
max | int Max number of commits to include in the message. For the rest a comment like (and x more) will be included. By default 100 commits are included. |
compact | bool If compact is set, each change will be shown in just one line |
show_ref | bool If each change reference should be present in the notes |
show_author | bool If each change author should be present in the notes |
show_description | bool If each change description should be present in the notes |
oldest_first | bool If set to true, the list shows the oldest changes first. Otherwise it shows the changes in descending order. |
use_merge | bool If true then merge changes are included in the squash notes |
'Squash notes' default is to print one line per change with information about the author
metadata.squash_notes("Changes for Project Foo:\n")
This transform will generate changes like:
Changes for Project Foo:
- 1234abcde second commit description by Foo Bar <foo@bar.com>
- a4321bcde first commit description by Foo Bar <foo@bar.com>
metadata.squash_notes("Changes for Project Foo:\n",
oldest_first = True,
show_author = False,
)
This transform will generate changes like:
Changes for Project Foo:
- a4321bcde first commit description
- 1234abcde second commit description
metadata.squash_notes("Changes for Project Foo:\n",
show_description = False,
)
This transform will generate changes like:
Changes for Project Foo:
- a4321bcde by Foo Bar <foo@bar.com>
- 1234abcde by Foo Bar <foo@bar.com>
metadata.squash_notes(
prefix = 'Changes for Project Foo:',
compact = False
)
This transform will generate changes like:
Changes for Project Foo:
--
2 by Foo Baz <foo@baz.com>:
second commit
Extended text
--
1 by Foo Bar <foo@bar.com>:
first commit
Extended text
Use metadata (message or/and author) from the last change being migrated. Useful when using 'SQUASH' mode but user only cares about the last change.
transformation
metadata.use_last_change(author=True, message=True, default_message=None, use_merge=True)
Parameter | Description |
---|---|
author | bool Replace author with the last change author (Could still be the default author if not on the allowlist or using |
message | bool Replace message with last change message. |
default_message | string or NoneType Replace message with last change message. |
use_merge | bool If true then merge changes are taken into account for looking for the last change. |
Verifies that a RegEx matches (or not matches) the change message. Does not transform anything, but will stop the workflow if it fails.
transformation
metadata.verify_match(regex, verify_no_match=False)
Parameter | Description |
---|---|
regex | string The regex pattern to verify. The re2j pattern will be applied in multiline mode, i.e. '^' refers to the beginning of a file and '$' to its end. |
verify_no_match | bool If true, the transformation will verify that the RegEx does not match. |
Check that the change message contains a text enclosed in <public></public>:
metadata.verify_match("<public>(.|\n)*</public>")
Reference to the change/review in the origin.
Name | Description |
---|---|
ref | string Origin reference ref |
Module for applying patches.
A transformation that applies the given patch files. If a path does not exist in a patch, it will be ignored.
transformation
patch.apply(patches=[], excluded_patch_paths=[], series=None, strip=1)
Parameter | Description |
---|---|
patches | sequence of string The list of patchfiles to apply, relative to the current config file. The files will be applied relative to the checkout dir and the leading path component will be stripped (-p1). |
excluded_patch_paths | sequence of string The list of paths to exclude from each of the patches. Each of the paths will be excluded from all the patches. Note that these are not workdir paths, but paths relative to the patch itself. If not empty, the patch will be applied using 'git apply' instead of GNU Patch. |
series | string or NoneType A file which contains a list of patches to apply. The patch files to apply are interpreted relative to this file and must be written one per line. The patches listed in this file will be applied relative to the checkout dir and the leading path component will be stripped (via the |
strip | int Number of segments to strip. (This sets the |
Command line flags:
Name | Type | Description |
---|---|---|
--patch-bin |
string | Path for GNU Patch command |
--patch-skip-version-check |
boolean | Skip checking the version of patch and assume it is fine |
--patch-use-git-apply |
boolean | Don't use GNU Patch and instead use 'git apply' |
--quilt-bin |
string | Path to quilt command |
A transformation that applies and updates patch files using Quilt. Compared to patch.apply
, this transformation supports updating the content of patch files if they can be successfully applied with fuzz. The patch files must be included in the destination_files glob in order to get updated. Underneath, Copybara runs quilt import; quilt push; quilt refresh
for each patch file in the series
file in order. Currently, all patch files and the series
file must reside in a "patches" sub-directory under the root directory containing the migrated code. This means it has the limitation that the migrated code itself cannot contain a directory with the name "patches".
transformation
patch.quilt_apply(series)
Parameter | Description |
---|---|
series | string A file which contains a list of patches to apply. It is similar to the |
Suppose the destination repository's directory structure looks like:
source_root/BUILD
source_root/copy.bara.sky
source_root/migrated_file1
source_root/migrated_file2
source_root/patches/series
source_root/patches/patch1.patch
Then the transformations in source_root/copy.bara.sky
should look like:
[
patch.quilt_apply(series = "patches/series"),
core.move("", "source_root"),
]
In this example, patch1.patch
is applied to migrated_file1
and/or migrated_file2
. patch1.patch
itself will be updated during the migration if it is applied with fuzz.
Command line flags:
Name | Type | Description |
---|---|---|
--patch-bin |
string | Path for GNU Patch command |
--patch-skip-version-check |
boolean | Skip checking the version of patch and assume it is fine |
--patch-use-git-apply |
boolean | Don't use GNU Patch and instead use 'git apply' |
--quilt-bin |
string | Path to quilt command |
Represents a path in the checkout directory
Name | Description |
---|---|
attr | PathAttributes Get the file attributes, for example size. |
name | string Filename of the path. For foo/bar/baz.txt it would be baz.txt |
parent | unknown Get the parent path |
path | string Full path relative to the checkout directory |
Read the symlink
Path
path.read_symlink()
Constructs a relative path between this path and a given path. For example:
path('a/b').relativize('a/b/c/d')
returns 'c/d'
Path
path.relativize(other)
Parameter | Description |
---|---|
other | Path The path to relativize against this path |
Resolve the given path against this path.
Path
path.resolve(child)
Parameter | Description |
---|---|
child | string or Path Resolve the given path against this path. The parameter can be a string or a Path. |
Resolve the given path against this path.
Path
path.resolve_sibling(other)
Parameter | Description |
---|---|
other | string or Path Resolve the given path against this path. The parameter can be a string or a Path. |
Represents a path attributes like size.
Name | Description |
---|---|
size | int The size of the file. Throws an error if file size > 2GB. |
symlink | bool Returns true if it is a symlink |
Set of functions to work with regexes in Copybara.
Create a regex pattern
re2_pattern
re2.compile(regex)
Parameter | Description |
---|---|
regex | string |
Patterns need to be compiled before using them:
re2.compile("a(.*)b").matches('accccb')
A RE2 regex pattern matcher object to perform regexes in Starlark
Return the end position of a matching group
int
re2_matcher.end(group=0)
Parameter | Description |
---|---|
group | int or string |
Return true if the string matches the regex pattern.
bool
re2_matcher.find(start=None)
Parameter | Description |
---|---|
start | int or NoneType The input position where the search begins |
Return a matching group
string
re2_matcher.group(group=0)
Parameter | Description |
---|---|
group | int or string |
Return the number of groups found for a match
int
re2_matcher.group_count()
Return true if the string matches the regex pattern.
bool
re2_matcher.matches()
Replace all instances matching the regex
string
re2_matcher.replace_all(replacement=0)
Parameter | Description |
---|---|
replacement | string |
Replace the first instance matching the regex
string
re2_matcher.replace_first(replacement=0)
Parameter | Description |
---|---|
replacement | string |
Return the start position of a matching group
int
re2_matcher.start(group=0)
Parameter | Description |
---|---|
group | int or string |
A RE2 regex pattern object to perform regexes in Starlark
Return true if the string matches the regex pattern
re2_matcher
re2_pattern.matcher(input)
Parameter | Description |
---|---|
input | string |
Return true if the string matches the regex pattern
bool
re2_pattern.matches(input)
Parameter | Description |
---|---|
input | string |
Input for posting a review to Gerrit. See https://gerrit-review.googlesource.com/Documentation/rest-api-changes.html#review-input
Immutable struct type.
Creates a new immutable struct. Structs with the same keys/values are equal. The struct's keys and values are passed in as keyword arguments.
StructImpl
struct()
Structs are immutable objects to group values.
my_struct = struct(foo='bar')
x = my_struct.foo
A single operation which modifies the source checked out from the origin, prior to writing it to the destination. Transformations can also be used to perform validations or checks.
Many common transformations are provided by the built-in libraries, such as core
.
Custom transformations can be defined in Starlark code via core.dynamic_transform
.
The status of a Transformation that was just run. Either a 'success' or a 'no-op'.
Name | Description |
---|---|
is_noop | bool Whether this status has the value NO-OP. |
is_success | bool Whether this status has the value SUCCESS. |
Data about the set of changes that are being migrated. It includes information about changes like: the author to be used for commit, change message, etc. You receive a TransformWork object as an argument when defining a dynamic transform
.
Name | Description |
---|---|
author | author Author to be used in the change |
changes | Changes List of changes that will be migrated |
console | Console Get an instance of the console to report errors or warnings |
message | string Message to be used in the change |
params | dict Parameters for the function if created with core.dynamic_transform |
Add a label to the end of the description
ctx.add_label(label, value, separator="=", hidden=False)
Parameter | Description |
---|---|
label | string The label to add |
value | string The new value for the label |
separator | string The separator to use for the label |
hidden | bool Don't show the label in the message but only keep it internally |
Replace an existing label or add it to the end of the description
ctx.add_or_replace_label(label, value, separator="=")
Parameter | Description |
---|---|
label | string The label to add/replace |
value | string The new value for the label |
separator | string The separator to use for the label |
Add a text to the description before the labels paragraph
ctx.add_text_before_labels(text)
Parameter | Description |
---|---|
text | string |
Create a symlink
ctx.create_symlink(link, target)
Parameter | Description |
---|---|
link | Path The link path |
target | Path The target path |
Returns an api handle for the destination repository. Methods available depend on the destination type. Use with extreme caution, as external calls can make workflow non-deterministic and possibly irreversible. Can have side effects in dry-runmode.
endpoint
ctx.destination_api()
Returns a handle to read files from the destination, if supported by the destination.
destination_reader
ctx.destination_reader()
Tries to find all the values for a label. First it looks at the generated message (that is, labels that might have been added by previous transformations), then it looks in all the commit messages being imported and finally in the resolved reference passed in the CLI.
sequence of string
ctx.find_all_labels(label)
Parameter | Description |
---|---|
label | string The label to find |
Tries to find a label. First it looks at the generated message (that is, labels that might have been added by previous transformations), then it looks in all the commit messages being imported and finally in the resolved reference passed in the CLI. Returns the first such label value found this way.
string
ctx.find_label(label)
Parameter | Description |
---|---|
label | string The label to find |
Create a new path
Path
ctx.new_path(path)
Parameter | Description |
---|---|
path | string The string representing the path, relative to the checkout root directory |
The status returned by a no-op Transformation
transformation_status
ctx.noop(message)
Parameter | Description |
---|---|
message | string |
Create a custom transformation which fails.
def my_transform(ctx):
# do some stuff
return ctx.noop('Error! The transform didn\'t do anything.')
Get current date as a string
string
ctx.now_as_string(format="yyyy-MM-dd", zone="UTC")
Parameter | Description |
---|---|
format | string The format to use. See: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html for details. |
zone | string The timezone id to use. See https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html. By default UTC |
Returns an api handle for the origin repository. Methods available depend on the origin type. Use with extreme caution, as external calls can make workflow non-deterministic and possibly irreversible. Can have side effects in dry-runmode.
endpoint
ctx.origin_api()
Read the content of path as UTF-8
string
ctx.read_path(path)
Parameter | Description |
---|---|
path | Path The Path to read from |
Remove a label from the message if present
ctx.remove_label(label, whole_message=False)
Parameter | Description |
---|---|
label | string The label to delete |
whole_message | bool By default Copybara only looks in the last paragraph for labels. This flagmake it replace labels in the whole message. |
Replace a label if it exist in the message
ctx.replace_label(label, value, separator="=", whole_message=False)
Parameter | Description |
---|---|
label | string The label to replace |
value | string The new value for the label |
separator | string The separator to use for the label |
whole_message | bool By default Copybara only looks in the last paragraph for labels. This flagmake it replace labels in the whole message. |
Run a glob or a transform. For example:files = ctx.run(glob(['**.java']))
orctx.run(core.move("foo", "bar"))
or
unknown
ctx.run(runnable)
Parameter | Description |
---|---|
runnable | glob or transformation When |
Update the author to be used in the change
ctx.set_author(author)
Parameter | Description |
---|---|
author | author |
Set the executable permission of a file
ctx.set_executable(path, value)
Parameter | Description |
---|---|
path | Path The Path to set the executable permission of |
value | bool Whether or not the file should be executable |
Update the message to be used in the change
ctx.set_message(message)
Parameter | Description |
---|---|
message | string |
The status returned by a successful Transformation
transformation_status
ctx.success()
Create a custom transformation which is successful.
def my_transform(ctx):
# do some stuff
return ctx.success()
For compatibility reasons, returning nothing is the same as returning success.
Write an arbitrary string to a path (UTF-8 will be used)
ctx.write_path(path, content)
Parameter | Description |
---|---|
path | Path The Path to write to |
content | string The content of the file |