  Forking is a typical way of code reuse, which provides a simple way for
developers to create a variant software (denoted as hard fork) by copying and
modifying an existing codebase. Despite of the benefits, forking also leads to
duplicate efforts in software maintenance. Developers need to port patches
across the hard forks to address similar bugs or implement similar features.
Due to the divergence between the source project and the hard fork, patch
porting is complicated, which requires an adaption regarding different
implementations of the same functionality. In this work, we take the first step
to automate patch porting for hard forks under a zero-shot setting. We first
conduct an empirical study of the patches ported from Vim to Neovim over the
last ten years to investigate the necessities of patch porting and the
potential flaws in the current practice. We then propose a large language model
(LLM) based approach (namely PPatHF) to automatically port patches for hard
forks on a function-wise basis. Specifically, PPatHF is composed of a reduction
module and a porting module. Given the pre- and post-patch versions of a
function from the reference project and the corresponding function from the
target project, the reduction module first slims the input functions by
removing code snippets less relevant to the patch. Then, the porting module
leverages a LLM to apply the patch to the function from the target project. We
evaluate PPatHF on 310 Neovim patches ported from Vim. The experimental results
show that PPatHF outperforms the baselines significantly. Specifically, PPatHF
can correctly port 131 (42.3%) patches and automate 57% of the manual edits
required for the developer to port the patch.
