Recording, splitting and combining changes
When working on code in your repository, you might come to a point
where you feel that the pijul log
doesn’t look quite as
nice as it could: Some changes don’t work on their own, or some change
is changing unrelated pieces of code. So you’d like to re-arrange (split
and / or combine) your changes so that other, well-cut changes
result.
On this page, you can learn how to achieve pijul log
nirvana with the tools at hand.
Recording a change
After editing the files in your repository, you want to make pijul
aware of the changes. You already came across the command(s) to do that:
pijul add
any files that aren’t tracked yet (probably using
the -r
flag for directories), and then
pijul record
all changes.
pijul record
opens an editor
for you containing a view of the change as it will be recorded:
message = ''
timestamp = '2020-12-07T06:59:38.257226181Z'
[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'
# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC
# Changes
1. File addition: "file3.txt" in "/" 644
up 1.0, new 0:11
+ ui
+ ae
+ nr
+ td
2. Edit in file2.txt:2 3.12
B:BD 3.22 -> 3.22:31/3
- uiaeuiae
3. Edit in file2.txt:3 3.12
up 3.40, new 26:35
+ uiaexvlc
4. Edit in file.txt:4 4.11
up 2.5, new 36:49
+ xvlcuiaexvlc
You can see the file is divided into three big blocks: the preamble with metadata about the change like message and author; one block describing the dependencies of this change; and one block containing a representation of all changes you made since recording the last change.
To finish recording, this file needs to be edited a bit and saved, and the editor window needs to be closed.
The message
field has to be filled in,
the fields under the [[author]]
heading
can be changed. Changes between
# Dependenices
and # Changes
will not be
regarded by pijul
; the dependencies will be computed after
you close the editor window. This part is purely informational.
The diff below # Changes
, however, is where you can get
creative with your change. The diff is composed of several small
sections. Each section is introduced by an enumeration and a very short
description of the diff (in the example you can see
Edit in file
and File addition
) and what file
the diff refers to.
You can remove any of these enumerated sections. This will leave the
diff out of the recorded change, but your working copy will not be
touched. This way, you can split up a big chunk of changes into several
small ones or - if there were changes you didn’t want to keep in your
repo - pijul reset
whatever is left.
Amending
Suppose you (or someone else working in the same repository) have already recorded a large change, which you want to split into two separate changes (maybe because you’d like to be able to push just one):
\$ pijul change 5HWYGVSSDKMEQP43H3JDSURPS7FJB4TXMAGMUAKSKWIFH6QRZN3QC
message = 'Big change, should be split up'
timestamp = '2020-12-05T15:34:38.416301967Z'
[[authors]]
name = 'me'
full_name = 'My Name'
email = 'me@gmail.com'
# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC
# Changes
1. File addition: "file2.txt" in "/" 644
up 1.0, new 0:11
+ xvlcxvlc
+ uiaeuiae
+ nrtdnrtd
2. Edit in file.txt:4 3.11
up 2.5, new 41:54
+ xvlcuiaexvlc
To edit the recorded change, you issue the command
\$ pijul record --amend 5HWYGVSSDKMEQP43H3JDSURPS7FJB4TXMAGMUAKSKWIFH6QRZN3QC
An editor will open showing the change (see above, Recording a change). Now, you can remove all sections you don’t want to go into the first change. Whatever you remove, the files themselves will still look the same as before the amend, only the record will have changed.
From here, you can pijul record
the next change, again
removing any sections you don’t want to have in it. Repeat until
done.
Splitting a change
Although amending a change should be enough in most, if not all, scenarios, you might be happy to know there’s an alternative:
By doing pijul unrecord
, directly followed by
pijul record
, and then opening a few instances of your
favourite text editor to cut and paste the result into multiple
temporary text files, you can pipe them into pijul apply
.
The whole procedure would look something like this:
Suppose we started with the change from above, and already did
pijul unrecord
to strip the record of the change, but not
the content of the change itself. When you issue
pijul record
, you will be presented with the following in
your editor:
message = ''
timestamp = '2020-12-07T06:59:38.257226181Z'
[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'
# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC
# Changes
1. File addition: "file3.txt" in "/" 644
up 1.0, new 0:11
+ ui
+ ae
+ nr
+ td
2. Edit in file2.txt:2 3.12
B:BD 3.22 -> 3.22:31/3
- uiaeuiae
3. Edit in file2.txt:3 3.12
up 3.40, new 26:35
+ uiaexvlc
4. Edit in file.txt:4 4.11
up 2.5, new 36:49
+ xvlcuiaexvlc
Now, you can split this text up into several files as you like, remembering to copy over the preamble of the original, resulting in something like this:
In file1:
message = 'First change'
timestamp = '2020-12-07T06:59:38.257226181Z'
[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'
# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC
# Changes
1. File addition: "file3.txt" in "/" 644
up 1.0, new 0:11
+ ui
+ ae
+ nr
+ td
2. Edit in file2.txt:2 3.12
B:BD 3.22 -> 3.22:31/3
- uiaeuiae
In file2:
message = 'Second change'
timestamp = '2020-12-07T06:59:38.257226181Z'
[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'
# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC
# Changes
3. Edit in file2.txt:3 3.12
up 3.40, new 26:35
+ uiaexvlc
And in file3:
message = 'Third change'
timestamp = '2020-12-07T06:59:38.257226181Z'
[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'
# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC
# Changes
4. Edit in file.txt:4 4.11
up 2.5, new 36:49
+ xvlcuiaexvlc
You don’t need to worry about the # Dependencies
block,
it just needs to be there. The dependencies themselves will be
re-computed by pijul when you record the change.
Now that your 3 files are saved, back out of the original
pijul record
by closing the editor without a message for
your change.
Finish the task by doing
\$ pijul apply <file1
\$ pijul apply <file2
\$ pijul apply <file3
or, if you have a real lot of files, you can do some clever shell script like
\$ for file in file*; do pijul apply <\$file; done
Combining changes
To combine multiple changes into one, there currently is no better
way than running pijul unrecord
on all changes you want to
combine, and then again pijul record
them as described
above.