[StGit PATCH] add option to import series directly from a tar archive

Previous thread: Extremely simple Vim interface for Git by Teemu Likonen on Saturday, September 6, 2008 - 3:37 pm. (11 messages)

Next thread: Re: [PATCH] Builtin-commit: show on which branch a commit was added by Junio C Hamano on Sunday, September 7, 2008 - 1:27 am. (33 messages)
To: <git@...>
Date: Saturday, September 6, 2008 - 11:47 pm

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Catalin/Karl,

Attached is my first cut at adding the ability to import a patch series by specifying
the tarball. For example, the following command:

$ stg import --tarfile patch-2.6.26.3-rt6.bz2

will apply the latest -rt patch series to your current kernel tree.

No Karl, I haven't developed a test for it (yet). I wanted to see what you guys
thought first :)

Clark
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iEYEARECAAYFAkjDTscACgkQqA4JVb61b9dNRgCZAW+tOCgz5Y+A0IdomcOA4X7v
u8MAnRvFWMXRJ0Kxv1rAnBRnheq6Iidi
=W7Dl
-----END PGP SIGNATURE-----

To: Clark Williams <clark.williams@...>
Cc: <git@...>
Date: Monday, September 8, 2008 - 2:03 pm

I don't see a problem with it, and if you took the time to code it
there is obviously at least one user (I have no idea how common patch
series tarballs are). I do have some comments below, but nothing that

As I hint below, you might want to autodetect tarballs with --series

I guess any occurrence of /../ in the middle of n should be caught as
well? Or can't that happen?

By the way, is the separator always '/' in tarfile? Or should you use
os.sep? (There is also os.pardir which you could use instead of '..',

Perhaps "no 'series' file ...", to make it clear what the name should

Hmm. It seems like such a waste to go via the file system here, when
tarfile has such nice file extraction methods.

What you could do is something like this:

1. Make two small classes with the same interface, one backed by a
tarfile and one backed by a directory, that have two methods:
get_series() and get_file(filename). Both methods return
file-like objects (created by either open() or
tarfile.extractfile()).

2. Change __import_series() to use objects of this class rather than
a directory directly -- starting with creating an instance of one
or the other depending on tarfile.is_tarfile(). This will involve
teaching __import_file to accept a file-like object instead of
just a file name, but that's a one-liner.

3. Drop the --tarfile flag, since you've just taught the --series
flag to handle tarballs!

That said, if you don't feel like doing it the hard way, I won't
insist. The way you coded it is in no way bad (in particular, you

Aaah! My eyes! My _eyes_!!!!!

Seriously, though, you'd want to use something like shutil.rmtree
here.

--
Karl Hasselström, kha@treskal.com
www.treskal.com/kalle
--

To: Karl Hasselström <kha@...>
Cc: <git@...>
Date: Monday, September 8, 2008 - 2:11 pm

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Patch series tarballs are quite common from people who use quilt (e.g. many of the
kernel -rt series developers). My biggest problem (now that I can directly import
them) is to see if I can ease StGit's patch import rules a bit, since quilt accepts
pretty much anything as long as there's a diff in there somewhere. I bomb out
regularly importing the -rt series using StGit, because some people don't put
complete email addresses in their patches.

Yeah I thought about that, as well as auto-detecting it in the file case. I'll look

Hence the "would you guys look at this?". Yeah, I need to detect sneaky stuff like

I doubt there are many Windows-generated tarballs out there (except for the Cygwin
case; I believe they use '/'), but I shouldn't be so Unix-centric. I'll work on
cleaning it up.

I did consider adding Zipfile support as well, but didn't get a very good match-up

Man, I could not for the life of me remember which module had that in it. To be fair
I wasn't up at work with my Python Essential Reference, which would have pointed me
directly at it, but I would have thought I could have gotten there through the Python
docs. Sigh...

You can dock my StGit pay for the visit to the eye doctor :)

Clark
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iEYEARECAAYFAkjFatgACgkQqA4JVb61b9fMRQCeLfK0zhPNEq3t5M4HW+vbRtaG
VhgAn0rtszqVLbd1bz12MS0b/3r0OkT2
=gkf1
-----END PGP SIGNATURE-----
--

To: Clark Williams <clark.williams@...>
Cc: Karl <kha@...>, <git@...>
Date: Friday, September 12, 2008 - 8:21 am

>>>>> "Clark" == Clark Williams <clark.williams@gmail.com> writes:

Clark> [...] is to see if I can ease StGit's patch
Clark> import rules a bit, since quilt accepts pretty much anything as
Clark> long as there's a diff in there somewhere. I bomb out regularly
Clark> importing the -rt series using StGit, because some people don't
Clark> put complete email addresses in their patches.

Two things that would be great would be:

- to be able to import patches with "-p0" (people not using git
often sends such patches)

- to be able to find where the patch should be applied; I sometimes
receive patches for GCC directory "gcc/ada/", diffed from there,
and if StGit could see that the patch only makes sense there and
not at the top-level it would be great as well

Sam
--
Samuel Tardieu -- sam@rfc1149.net -- http://www.rfc1149.net/

--

To: Samuel Tardieu <sam@...>
Cc: Karl Hasselström <kha@...>, <git@...>
Date: Friday, September 12, 2008 - 8:57 am

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I'm not sure how easy this is going to be. It looks like the patch is applied with
'git --apply' from the file stgit/git.py:apply_patch(). The default '-p' value is 1,
so we'd have to figure out how to pass the 0 along and then get it into the

Zowie, I thought I only had to worry about folks sending patches with incomplete
information. So you get patches to the ada compiler that are rooted in gcc/ada (e.g.
patch in tarball says "./ChangeLog", instead of gcc/ada/ChangeLog) rather than at a
top level? Only way I could see to deal with that would be to try and pass in the
appropriate prefix from the command line.

My current plans are to clean up the first cut at the tarfile logic, then write a
test to keep Karl happy, then try to come up with a way to deal with importing
patches that don't have complete email addresses, no descriptions, etc. Once I get
through that, I'll see if we can deal with weirdly rooted patch series.

Clark
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org

iEYEARECAAYFAkjKZ0sACgkQqA4JVb61b9eg2ACffDv+FXsL1NifMvxr1tbO2c3s
Hc4AoJPb/RZJrpqT6QybeZrj8rNFJg1y
=ccj/
-----END PGP SIGNATURE-----
--

To: Clark Williams <clark.williams@...>
Cc: Samuel Tardieu <sam@...>, <git@...>
Date: Friday, September 12, 2008 - 11:44 am

Technically, you write the test to make sure that your new feature
works as intended and won't break in the future. But since that's

Nice.

--
Karl Hasselström, kha@treskal.com
www.treskal.com/kalle
--

To: Clark Williams <clark.williams@...>
Cc: Karl <kha@...>, <git@...>
Date: Friday, September 12, 2008 - 9:59 am

>>>>> "Clark" == Clark Williams <clark.williams@gmail.com> writes:

Clark> Zowie, I thought I only had to worry about folks sending
Clark> patches with incomplete information. So you get patches to the
Clark> ada compiler that are rooted in gcc/ada (e.g. patch in tarball
Clark> says "./ChangeLog", instead of gcc/ada/ChangeLog) rather than
Clark> at a top level? Only way I could see to deal with that would be
Clark> to try and pass in the appropriate prefix from the command
Clark> line.

Yes, passing the prefix and strip levels would be fine.

Sam
--
Samuel Tardieu -- sam@rfc1149.net -- http://www.rfc1149.net/

--

To: Samuel Tardieu <sam@...>
Cc: Clark Williams <clark.williams@...>, <git@...>
Date: Friday, September 12, 2008 - 9:07 am

This should be trivial to implement, since git-apply (pardon the dash)

I don't believe git-apply can do this (please correct me if I'm
wrong), and the right way to teach StGit to do it would arguably be to
teach it to git-apply and then make StGit use it. It'd be _possible_
to do it directly in StGit, but it wouldn't be quite the right level,
and git users wouldn't benefit.

--
Karl Hasselström, kha@treskal.com
www.treskal.com/kalle
--

To: Samuel Tardieu <sam@...>
Cc: Clark Williams <clark.williams@...>, <git@...>
Date: Friday, September 12, 2008 - 9:08 am

It does have a --directory flag, but that requires the user to specify
the path manually.

--
Karl Hasselström, kha@treskal.com
www.treskal.com/kalle
--

To: Clark Williams <clark.williams@...>
Cc: <git@...>
Date: Monday, September 8, 2008 - 5:22 pm

I had a quick look at the zipfile module, and it looks like it too
could easily be wrapped in a small class like I suggested in point

Just don't let my suggestions take all the fun out of contributing ...

--
Karl Hasselström, kha@treskal.com
www.treskal.com/kalle
--

Previous thread: Extremely simple Vim interface for Git by Teemu Likonen on Saturday, September 6, 2008 - 3:37 pm. (11 messages)

Next thread: Re: [PATCH] Builtin-commit: show on which branch a commit was added by Junio C Hamano on Sunday, September 7, 2008 - 1:27 am. (33 messages)