Hello, bsgit can now also import and export source links, and can now be used as a fully-featured client for manipulating package sources. There are still a few rough edges here and there though; don't expect things to be perfect just yet ;-) In the openSUSE build service, bsgit can be found here: home:agruen:Factory/bsgit the git sources have moved to: http://gitorious.org/opensuse/bsgit Functions beyond source code version control, like accessing status information and logs, manipulating project and package configurations, are not supported and should need to be done in osc as before. SOURCE LINKS, EXPANSION, AND MERGES =================================== There is an important difference between osc and bsgit for source links: Osc always automatically checks out the latest "expanded version" of the link. To do that, it merges the latest revision of the source link with the latest revision of its parent (recursively when the parent is a source link itself). This has the following effects: * Checking out a specific revision of a source link will lead to different results as new parent revisions are made. * The osc user interface does not offer a way to check which revisions of which parents have been merged (or not). Changes in a parent do not show up in "osc log". * There is no (realistic) way to verify that a merge is correct. * When a merge fails, the "expanded version" of the source link cannot be checked out anymore; the merge conflict first has to be resolved (i.e., the link first has to be "repaired" with the osc repairlink command). In contrast, bsgit never automatically merges revisions when checking out a package; revisions always stays the same no matter if parents have changed. However, bsgit will tell when a parent has changed so that those merges can be performed manually. The merges themselves can then be done manually; for conflict free merges, a simple "git merge <revision>" will be enough. (In case of conflicts, all the power of git is available.) BUILD TIME MERGES ================= Of course we do want to keep the core functionality of source links, which is to allow changes in parents to propagate and trigger rebuilds of link packages. The build service will continue to automatically merge the most recent revisions of source links and their parents for building, and merge conflicts will lead to build failures just like they do now. ARBITRARY MERGES, LOSS OF INFORMATION ===================================== The build service backend is not capable of storing some of the information that git knows about: merges are only possible in the form of source links as described above, there is no distinction between author and commiter, file modes are not stored, timestamps are computed on the server, there is no support for non-regular files or subdirectories. When pushing a commit to the build service, some information is always lost. Checking out the new revision will lead to the same source files, but with different meta-information. Therefore, a push to the build service always also results in a rewrite of the local git repository (so that the local version matches the build service version). This is unfortunate as it breaks merging across build service instances and makes exchanging commits between build service instances much harder, but this breakage is unavoidable with the current backend. EXAMPLE 1: ORDINARY PACKAGE =========================== Here is an example of making a change to a normal (non-source link) package. $ mkdir obs $ cd obs $ git init Initialized empty Git repository $ bsgit fetch home:agruen:Factory/bsgit Fetching home:agruen:Factory/bsgit (1) Fetching home:agruen:Factory/bsgit (2) Fetching home:agruen:Factory/bsgit (3) Fetching home:agruen:Factory/bsgit (4) Fetching home:agruen:Factory/bsgit (5) Fetching home:agruen:Factory/bsgit (6) Branch 'bsgit' created. # change something # git commit $ bsgit push Cannot map email 'agruen@suse.de' to a build service account name. Please use the usermap command. $ bsgit usermap agruen agruen@novell.com agruen@suse.de $ bsgit push Pushing 1 commit Fetching home:agruen:Factory/bsgit (7) Branch 'bsgit' rebased from 51cbd2c to ed5842a. Note that pushing the local changes back to the build service results in a rebase of the local git repository (see ARBITRARY MERGES, INFORMATION LOSS above). EXAMPLE 2: SOURCE LINK AS FORK ============================== $ osc linkpac home:agruen:Factory/bsgit home:agruen/mybsgit $ bsgit fetch home:agruen/mybsgit Warning: home:agruen/mybsgit (1): link target guessed as \ bsgit(4f929e86345b9bd90364eec685756a98) based on timestamps. Fetching home:agruen/mybsgit (1) Branch 'mybsgit' created. This warning indicates that the build service meta-data do not define which revision of home:agruen:Factory/bsgit revision 1 of home:agruen/mybsgit is based on. (This has been reported as bug https://bugzilla.novell.com/516795.) $ git checkout mybsgit # change something, git commit $ bsgit push $ osc submitrequest home:agruen/mybsgit home:agruen:Factory/bsgit created request id 15351 $ osc request accept 15351 --message="reviewed ok." <status code="ok" /> $ bsgit pull home:agruen:Factory/bsgit Fetching home:agruen:Factory/bsgit (9) Branch 'bsgit' updated. EXAMPLE 3: SOURCE LINK AND MERGE ================================ $ osc linkpac home:agruen:Factory/bsgit home:agruen/mybsgit2 $ bsgit fetch home:agruen/mybsgit2 $ git checkout mybsgit2 # Change something in mybsgit2 # Commit something to home:agruen:Factory/bsgit $ bsgit pull home:agruen/mybsgit2 Package home:agruen/mybsgit2 not based on the latest expansion of \ home:agruen:Factory/bsgit (commit 9cd5476); \ you may want to merge. $ git merge Merge made by recursive. ... $ bsgit push Pushing 1 commit Fetching home:agruen/mybsgit2 (3) Branch 'mybsgit2' rebased from ac4bc7b to 79760ba. Cheers, Andreas -- To unsubscribe, e-mail: opensuse-buildservice+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-buildservice+help@opensuse.org