Table Of Contents
I am using DWM since a couple of years, even wrote a patch to allow the user color its status bar. Since then, I never check out the new code in DWM that was being released because I did not think I would be able to merge the new code with my personalized DWM. That was until I discovered DWM-Patches and learned to use quilt.
What is Quilt?
Well, here is its man
description:
Quilt is a tool to manage large sets of patches by keeping track of the changes each patch makes. Patches can be applied, un-applied, refreshed, etc. The key philosophical concept is that your primary output is patches.
Basic usage
Lets see an easy example, suppose the file below:
# fichero.txt
line 1
line 2
line 3
fichero.txt
would be our base file.
Creating a patch
To create a new patch, we need to execute quilt new patch1.diff
:
$ quilt new patch1.diff
Patch patches/patch1.diff is now on top
Making changes
Now, tell quilt
what file we want to edit:
$ quilt edit fichero.txt
File fichero.txt added to patch patches/patch1.diff
Now, we are all set to edit the file, lets write one sentence:
linea 1
edit 1 (by patch1.diff)
linea 2
linea 3
See the changes
Once we have finish editing the file, we can see its diff:
$ quilt diff
Index: _drafts/fichero.txt
===================================================================
--- _drafts.orig/fichero.txt
+++ _drafts/fichero.txt
@@ -1,3 +1,4 @@
linea 1
+edit 1 (by patch1.diff)
linea 2
linea 3
Creating the patch
The patch it is not created yet, for that we need to execute:
$ quilt refresh
Refreshed patch patches/patch1.diff
Manage Patches
All right, now in patches/
there is a patch called patch1.diff
, it store our changes to fichero.txt
. Right now we only have one patch, in order to undo all the changes and restore fichero.txt
to its original state we must execute:
$ quilt pop
Removing patch patches/patch1.diff
Restoring fichero.txt
No patches applied
Now fichero.txt
do not have our modification:
$ cat fichero.txt
linea 1
linea 2
linea 3
If we have more than one patch, quilt pop
accepts as input the patch name, or -a
option to remove all applied patches. Lets create one second patch:
Second patch
Before creating a new patch, it is necessary to apply the first, or if we had many, all of them:
$ quilt push -a
Applying patch patches/patch1.diff
patching file fichero.txt
Now at patch patches/patch1.diff
Now we can create a second patch:
$ quilt new patch2.diff
Patch patches/patch2.diff is now on top
List the patch stack
In order to see how many patchs we have, execute quilt series
:
$ quilt series
patches/patch1.diff
patches/patch2.diff
The bottom patch is patch2
, right now it is empty, because at the moment we have not edit anything. For this patch we are goint to modify fichero1.txt
and create a second one, fichero2.txt
$ quilt add fichero2.txt
File fichero2.txt added to patch patches/patch2.diff
$ quilt add fichero.txt
File fichero.txt added to patch patches/patch2.diff
$ echo "Line created by patch2.diff" >> fichero.txt
$ echo "New file created by patch2.diff" > fichero2.txt
$ quilt diff
Index: _drafts/fichero.txt
===================================================================
--- _drafts.orig/fichero.txt
+++ _drafts/fichero.txt
@@ -2,3 +2,4 @@ linea 1
edit 1 (by patch1.diff)
linea 2
linea 3
+Line created by patch2.diff
Index: _drafts/fichero2.txt
===================================================================
--- /dev/null
+++ _drafts/fichero2.txt
@@ -0,0 +1 @@
+New file created by patch2.diff
Finally, all that is left is apply the changes with quilt refresh
:
$ quilt refresh
Refreshed patch patches/patch2.diff
When finished editing, it is recommended to restore the initial state, undoing all the patchs:
$ quilt pop -a
Removing patch patches/patch2.diff
Restoring fichero.txt
Removing fichero2.txt
Removing patch patches/patch1.diff
Restoring fichero.txt
No patches applied
$ ll
-rw-r--r-- 1 hkr hkr 24 Jan 30 18:31 fichero.txt
drwxr-xr-x 2 hkr hkr 4.0K Jan 30 18:29 patches/
drwxr-xr-x 2 hkr hkr 4.0K Jan 30 18:31 .pc/
To apply them again:
$ quilt push -a
Applying patch patches/patch1.diff
patching file fichero.txt
Applying patch patches/patch2.diff
patching file fichero.txt
patching file fichero2.txt
Now at patch patches/patch2.diff
$ ll
-rw-r--r-- 1 hkr hkr 38 Jan 30 18:32 fichero2.txt
-rw-r--r-- 1 hkr hkr 89 Jan 30 18:32 fichero.txt
drwxr-xr-x 2 hkr hkr 4.0K Jan 30 18:29 patches/
drwxr-xr-x 4 hkr hkr 4.0K Jan 30 18:32 .pc/
In order to see a real, more complicated example, visit my DWM repo.
Bibliography
- UsingQuilt | wiki.debian.org
- How To Survive With Many Patches | stuff.mit.edu
Spot a typo?: Help me fix it by contacting me or commenting below!