Some hours ago I have worked on fix of eclipse build. But two parallel builds of eclipse (there are eclipse.spec and eclipse-archdep.spec) eats almost all resources of my computer, which was unusable. Fortunately vim needs a little of CPU time, so I decided to improve smarter osc commit, I implemented on Friday.
If you work with osc and packaging, you probably forgot to add a new patch, or source and commits sources with missing file, so build in OBS fails. Our internal script, which we used before BuildService has a check, which warns about files not specified in Patch or Source in a spec file, so it was a great feature for forgetful developers (as myself, for example). The problem is how to get a list of sources and patches for a current spec file? The internal script uses some “magic” shell code which calls a rpmbuild, because it’s rather impossible to parse a specfile correctly. Fortunately there is a simplest approach.
In build service package directory each file has a state – added, modified, removed, …. So my idea is simple – check state of all files in the directory and if there is any file with ‘?’ (file exists, but not in metadata) or ‘!’ (file is in metadata, but not in directory) state, ask user what to do. The initial implementation allows to continue or abort and was not user friendly as it could be. So during rebuild of (two) eclipse I wrote a better implementation.
Lets have a package (for example called xdoclet) and we want commit our changes to OBS. So
$ osc status
? xdoclet-modules-objectweb-4.6.tar.bz2
? xdoclet-src-1.2.3.tar.bz2
! xdoclet-modules-objectweb-4.6.tgz
! xdoclet-src-1.2.3.tgz
M xdoclet.changes
M xdoclet.spec
You see, that we used bznew to repack tgz files to tar.bz2, which is recommended in openSUSE. Then we commit our changes
osc commit
File `xdoclet-modules-objectweb-4.6.tar.bz2' is not in package meta. Would you like skip/remove/edit file lists/commit/abort? (s/r/e/c/A)
I suppose that all options are clear – skip will skip check for this file, remove will remove it, commit forced commit and abort breaks it. But I don’t like this message, so if you have some better proposal, please contact me.
The most important command is edit file list. I thought how to easily add and remove files using this smarter commit. The final implementation has been inspired by one of the coolest git feature – interactive rebase.
So after selecting e, the list of files is opened in your EDITOR
1 leave xdoclet-AbstractProgramElementTagsHandler.patch
2 leave xdoclet-WebLogicSubTask.patch
3 leave xdoclet-XDocletModulesEjbMessages.patch
4 leave xdoclet-ant.not-required.patch
5 leave xdoclet-build_docs_xml.patch
6 leave xdoclet-build_xml.patch
7 leave xdoclet-component-info.xml
8 leave xdoclet-maven-plugin-project.patch
9 leave xdoclet-maven-plugin-template.patch
10 leave ? xdoclet-modules-objectweb-4.6.tar.bz2
11 remove ! xdoclet-modules-objectweb-4.6.tgz
12 leave xdoclet-project_xml.patch
13 leave ? xdoclet-src-1.2.3.tar.bz2
14 remove ! xdoclet-src-1.2.3.tgz
15 leave M xdoclet.changes
16 leave M xdoclet.spec
17
18 # Edit a filelist for package %s
19 # Commands:
20 # l, leave = leave a file as is
21 # r, remove = remove a file
22 # a, add = add a file
23 #
24 # If you remove file from a list, it will be unchanged
25 # If you remove all, commit will be aborted
and a manipulation is obvious. Just replace a command listed in a first column by another one, then save a file and instructions will be processed and package will be commited.
BTW: Of course this feature can be suppressed by new -f/–force option.