On Tue, Mar 07, 2023 at 12:43:42PM +0100, Vegard Nossum wrote: > This whole document is meant for the developer doing the backport. > > git-format-patch --base= is already covered here: > > https://docs.kernel.org/process/submitting-patches.html#providing-base-tree-information > > I don't think we need to repeat it in this document. OK. > > > > "In most cases, you will likely want to cherry-pick with ``-x`` option > > to record upstream commit in the resulting backport commit description, > > which looks like:: > > > > (cherry picked from commit <upstream commit>) > > > > However, for backporting to stable, you need to edit the description > > above to either:: > > > > commit <upstream commit> upstream > > > > or > > [ Upstream commit <upstream commit> ] > > > > " > > Good point -- the original blog post where this came from was meant to > be more general than just stable backports, but this document in > particular is partly also meant to aid stable contributors we might as > well include it. Nice. > > > > +For backports, what likely happened was that your older branch is > > > +missing a patch compared to the branch you are backporting from -- > > > +however, it is also possible that your older branch has some commit that > > > +doesn't exist in the newer branch. In any case, the result is a conflict > > > +that needs to be resolved. > > > > Another conflict culprit that there are non-prerequisite commits that > > change the context line. > > I think that's already covered by "missing a patch", or at least that > was my intention. I guess we can change it to something like: > > +For backports, what likely happened was that the branch you are > +backporting from contains patches not in the branch you are backporting > +to. However, it is also possible that your older branch has some commit > +that doesn't exist in the newer branch. In any case, the result is a > +conflict that needs to be resolved. What I mean is "hey, we have changes that make context lines conflicted". By "patches not in the branch", I interpret that as "we have possible non-prereqs that cause this (messy) conflict". > > I'll fiddle a bit more with the exact phrasing. > > > > +git log > > > +^^^^^^^ > > > + > > > +A good first step is to look at ``git log`` for the file that has the > > > +conflict -- this is usually sufficient when there aren't a lot of > > > +patches to the file, but may get confusing if the file is big and > > > +frequently patched. You should run ``git log`` on the range of commits > > > +between your currently checked-out branch (``HEAD``) and the parent of > > > +the patch you are picking (``COMMIT``), i.e.:: > > > + > > > + git log HEAD..COMMIT^ -- PATH > > > > HEAD and <commit> swapped, giving empty log. The correct way is: > > > > ``` > > git log <commit>^..HEAD -- <path> > > ``` > > Hrrm, I've double checked this and I think the original text is correct. > > HEAD..<commit>^ gives you commits reachable from <commit>^ (parent of > the commit we are backporting), excluding all commits that are reachable > from HEAD (the branch we are backporting to). > > <commit>^..HEAD, on the other hand, would give you commits reachable > from HEAD excluding all commits that are reachable from the parent of > the commit we are backporting. > > With a diagram like this: > > o--o--x--y--<commit> > \ > \--u--v--HEAD > > HEAD..<commit>^ would give you x and y while > <commit>^..HEAD would give you u and v. In any case, the HEAD you mentioned is at target branch (linux-x.y), right? > > > +Sometimes the right thing to do will be to also backport the patch that > > > +did the rename, but that's definitely not the most common case. Instead, > > > +what you can do is to temporarily rename the file in the branch you're > > > +backporting to (using ``git mv`` and committing the result), restart the > > > +attempt to cherry-pick the patch, rename the file back (``git mv`` and > > > +committing again), and finally squash the result using ``git rebase -i`` > > > +(`tutorial <https://medium.com/@slamflipstrom/a-beginners-guide-to-squashing-commits-with-git-rebase-8185cf6e62ec>`__) > > > +so it appears as a single commit when you are done. > > > > I'm kinda confused with above. Did you mean that after renaming file, I > > have to abort cherry-picking (``git cherry-pick --abort``) first and > > then redo cherry-picking? > > Yes, the idea is that instead of trying to resolve it as a conflict, you > rename the file first, do a (clean) cherry-pick, and then rename it back. > > What caused the confusion, specifically? I thought that the sequence was: ``` $ git checkout -b my-backport linux-x.y $ git cherry-pick <upstream commit> # we get mv/modified content conflict $ git mv <original path> <intended path> && git commit $ git cherry-pick --abort $ git cherry-pick <upstream commit> # resolve content conflicts $ git add <conflicted path>... && git commit $ git rebase -i linux-x.y ``` > > > > +Build testing > > > +~~~~~~~~~~~~~ > > > + > > > +We won't cover runtime testing here, but it can be a good idea to build > > Runtime testing is described in the next section. > > > +just the files touched by the patch as a quick sanity check. For the > > > +Linux kernel you can build single files like this, assuming you have the > > > +``.config`` and build environment set up correctly:: > > > + > > > + make path/to/file.o > > > + > > > +Note that this won't discover linker errors, so you should still do a > > > +full build after verifying that the single file compiles. By compiling > > > +the single file first you can avoid having to wait for a full build *in > > > +case* there are compiler errors in any of the files you've changed. > > > + > > > > plain ``make``? > > Yes, but I don't think we need to spell that out as it's the common case > (in other words, it is presupposed that you know this). > > > > +One concrete example of this was where a patch to the system call entry > > > +code saved/restored a register and a later patch made use of the saved > > > +register somewhere in the middle -- since there was no conflict, one > > > +could backport the second patch and believe that everything was fine, > > > +but in fact the code was now scribbling over an unsaved register. > > > > Did you mean the later patch is the backported syscall patch? > > Yes. I'll fiddle a bit with this paragraph to make it clearer. So, in that case, what would the correct resoultion be regarding to registers? > > For the external link targets, I'd like to separate them from > > corresponding link texts (see > > https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#external-links > > for details). > > We can probably do that, but it doesn't seem to be used much in existing > kernel documentation, I find no existing instances of it: > > $ git grep '\.\._.*: http' Documentation/ > $ I recently worked on Documentation/bpf/bpf_devel_QA.rst, where I mention this linking syntax. > > I know that lots of people really prefer to minimize the amount of > markup in these files (as they consume them in source form), so I'd > really like an ack from others before doing this. > OK. For now I'm OK with either separating targets or including them. Thanks for reply! -- An old man doll... just what I always wanted! - Clara
Attachment:
signature.asc
Description: PGP signature