google / copybara

Copybara: A tool for transforming and moving code between repositories.
Apache License 2.0
2.08k stars 246 forks source link

First time importing pull request from public to private #107

Open maksyche opened 4 years ago

maksyche commented 4 years ago

Hello!

I'm stuck on importing PRs.

But I need to migrate only PR changes. I think I can use something like patch. Is there any solutions for doing it using Copybara?

Here's my current config:

core.workflow(
  name = "import_pr_from_oss",

  origin = git.github_pr_origin(
    url = publicRepoUrl,
    state = "ALL",
    use_merge = True,
  ),
  destination = git.github_pr_destination(
    url = internalRepoUrl,
    destination_ref = "master-internal", # TODO: Update to master after test
    integrates = [],
  ),
  mode = "CHANGE_REQUEST",
  set_rev_id = False,

  authoring = authoring.pass_thru("**authoring here**"),

  # Including/excluding files
  origin_files = glob(["**"], exclude = [

    # exclude hidden files
    ".**",
    "**/.**",

    # exclude all private sources
    "private/**",

    # exclude helper scripts and related
    "**.sh",
    "**.log",
    "**.rc",
    "revision.txt",

    # exclude generated bits
    "**/target/**",
    "**/node_modules/**",

  ]) + glob([

    # keep some specified files
    ".circleci/config.yml",
    "**/.placeholder",
    ".mvn/**",
  ]),

  destination_files = glob(["**"], exclude = [

    # exclude hidden files
    ".**",
    "**/.**",

    # exclude all private sources
    "private/**",

    # exclude helper scripts and related
    "**.sh",
    "**.log",
    "**.rc",
    "revision.txt",

    # exclude generated bits
    "**/target/**",
    "**/node_modules/**",
  ]) + glob([

    # keep some specified files
    ".circleci/config.yml",
    "**/.placeholder",
    ".mvn/**",
  ]),

  transformations = [
    metadata.save_author(),
    metadata.expose_label("COPYBARA_INTEGRATE_REVIEW")
    metadata.replace_message("${GITHUB_PR_TITLE}\n\n${GITHUB_PR_BODY}\n\nSubmitted by: @${GITHUB_PR_USER}\n\nExternal PR number: #${GITHUB_PR_NUMBER}"),
  ],

Thank you!

DarthHater commented 4 years ago

@mikelalcon we are working to get Copybara working on an existing project (nexus repository, wee!), and this is holding us up a bit. Any thoughts?

mikelalcon commented 4 years ago

Hi!

core.workflow has smart_prune field. Unfortunately, this field usage is not implemented for git.destination. The use case is when you do scrubbing from internal to external repo.

Keeping that usage apart, there is not usage for it, as the source should converge to one version (internal and external).

The other option is to use patch.apply or git.origin patch field. This allows you to apply internal only patches to the import. (This would be used if external is the SoT)

maksyche commented 4 years ago

Hi!

core.workflow has smart_prune field. Unfortunately, this field usage is not implemented for git.destination. The use case is when you do scrubbing from internal to external repo.

Keeping that usage apart, there is not usage for it, as the source should converge to one version (internal and external).

The other option is to use patch.apply or git.origin patch field. This allows you to apply internal only patches to the import. (This would be used if external is the SoT)

Thank you! Is there any examples with patch usage? I cannot find them in docs

mikelalcon commented 4 years ago

We don't have. Here is an example:

Assuming you have this file structure:

copy.bara.sky
patches/patch1.patch
patches/patch2.patch

You would add:

origin = git.github_pr_origin(
   ...
   patch = patch.apply(["patches/patch1.patch", "patches/patch2.patch"]),
   ...
)

or

transformations = [
   ...
   patch.apply(["patches/patch1.patch", "patches/patch2.patch"]),
   ...
]

The advantage of the git origin version is that if you generate the patch from the origin repo ( maybe do an initial temporary and local git apply of the internal patch to the external repo and then save that patch) it will use 3way merge when applying the patch.

armooo commented 4 years ago

I took a shot at adding smart_prune support in #112. At least for my use case it has allowed importing PRs from github when scrubbing was used in the export process.