Re: Feature suggestion: .stow-rename
Danielle McLean <[email protected]> Fri, 20 Apr 2018 17:25:44 +1000
| Newsgroups | gmane.comp.gnu.stow.devel |
|---|---|
| Message-ID | <[email protected]> |
This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --B22dQb1XpjWXQQ0d1t2PxUCs7nzxSXnrN Content-Type: multipart/mixed; boundary="lUsOK6QPxK1k3pnOG0cKUEI9JQolHnRZD"; protected-headers="v1" From: Danielle McLean <[email protected]> To: [email protected] Message-ID: <[email protected]> Subject: Re: Feature suggestion: .stow-rename References: <CAJnbmRQbS4zdZaNJyWjE=s35qq-FTa4b584HZYe7eE1=BR4DRQ@mail.gmail.com> In-Reply-To: <CAJnbmRQbS4zdZaNJyWjE=s35qq-FTa4b584HZYe7eE1=BR4DRQ@mail.gmail.com> --lUsOK6QPxK1k3pnOG0cKUEI9JQolHnRZD Content-Type: multipart/mixed; boundary="------------CF01C75100A456E618761992" Content-Language: en-US This is a multi-part message in MIME format. --------------CF01C75100A456E618761992 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 10/10/16 08:36, Danielle McLean wrote: > I suggest an extension to Stow: the .stow-rename file. A file called =2Estow-rename may be placed in the root directory of each package - it i= s a text file in the format: > > stow_name =3D> target_name > stow_name_2 =3D> target_name_2 > > (This format was chosen as it closely resembles a Perl hash - which is also what's used to store the rename information in my implementation. c:= ) Hi again! It's been over a year since I last spoke about this feature. Sorry about that! Anyway, since my last message I've implemented support for reading and obeying .stow-rename files in upstream Stow - renames are permitted to use arbitrary Perl pattern/substitute strings, so only one rename definition is needed to reimplement the behaviour of --dotfiles. Indeed, I changed the existing --dotfiles implementation so it simply inserts the appropriate rename on the fly, and all the tests for --dotfiles still pass. I'm pretty happy with it overall! However, I'm not comfortable making a pull request yet, because I've found a really tricky issue: attempting to unfold a directory will fail if that directory has been renamed, by either --dotfiles or my new =2Estow-rename implementation. Here's a simple example, tested using Stow= master. $ mkdir -p ~/stowdir/first/dot-a/b ~/stowdir/second/dot-a/a $ tree ~/stowdir -F ~/stowdir =E2=94=9C=E2=94=80=E2=94=80 first/ =E2=94=82=C2=A0=C2=A0 =E2=94=94=E2=94=80=E2=94=80 dot-a/ =E2=94=82=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =E2=94=94=E2=94=80=E2=94=80= b/ =E2=94=94=E2=94=80=E2=94=80 second/ =C2=A0=C2=A0=C2=A0 =E2=94=94=E2=94=80=E2=94=80 dot-a/ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =E2=94=94=E2=94=80=E2=94=80 a/= $ stow --dotfiles -vvv -d ~/stowdir -S first second stow dir is /Users/dani/stowdir stow dir path relative to target /Users/dani is stowdir cwd now /Users/dani cwd restored to /Users/dani/builds/stow cwd now /Users/dani Planning stow of package first... Stowing contents of stowdir/first (cwd=3D/Users/dani) Stowing stowdir / first / .a LINK: .a =3D> stowdir/first/dot-a Planning stow of package first... done Planning stow of package second... Stowing contents of stowdir/second (cwd=3D/Users/dani) Stowing stowdir / second / .a --- Unfolding .a which was already owned by first UNLINK: .a (reverts previous action) MKDIR: .a Stowing contents of stowdir/first/.a (cwd=3D/Users/dani) stow: ERROR: stow_contents() called with non-directory path: stowdir/first/.a Stowing exactly one of those two packages works, since it doesn't try to unfold the target directory. Unfortunately, attempting to subsequently stow the second package of course leads to unfolding and produces the same error. Since the majority of my dotfiles packages keep stuff in $XDG_CONFIG_HOME and therefore absolutely require unfolding to work, this is a serious inconvenience. I'm not really sure how to fix this - Stow seems to juggle the source and target paths fairly readily, presumably under the assumption that they're identical, so keeping them reliably separate seems tricky. The version of Stow I wrote back in 2016 https://github.com/00dani/dot-stow *does* handle this case properly, but it only supports static replacements rather than patterns and wasn't written with contributing upstream in mind, so I have no idea how it works now. :/ I've attached the diff for my new .stow-rename implementation, in case there's something obviously wrong I haven't spotted, but since --dotfiles has the same issue I kind of doubt it'll be simple. Thoughts? Danielle c: --------------CF01C75100A456E618761992 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="stow-rename.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="stow-rename.patch" ZGlmZiAtLWdpdCBhL2xpYi9TdG93LnBtLmluIGIvbGliL1N0b3cucG0uaW4KaW5kZXggZTE5 MGM2Yy4uNjA4NzUzNyAxMDA3NTUKLS0tIGEvbGliL1N0b3cucG0uaW4KKysrIGIvbGliL1N0 b3cucG0uaW4KQEAgLTM5LDYgKzM5LDcgQEAgdXNlIENhcnAgcXcoY2FycCBjbHVjayBjcm9h ayBjb25mZXNzIGxvbmdtZXNzKTsKIHVzZSBGaWxlOjpDb3B5IHF3KG1vdmUpOwogdXNlIEZp bGU6OlNwZWM7CiB1c2UgUE9TSVggcXcoZ2V0Y3dkKTsKK3VzZSBTdHJpbmc6OkludGVycG9s YXRlIHF3KHNhZmVfaW50ZXJwb2xhdGUpOwogCiB1c2UgU3Rvdzo6VXRpbCBxdyhzZXRfZGVi dWdfbGV2ZWwgZGVidWcgZXJyb3Igc2V0X3Rlc3RfbW9kZQogICAgICAgICAgICAgICAgICAg am9pbl9wYXRocyByZXN0b3JlX2N3ZCBjYW5vbl9wYXRoIHBhcmVudCBhZGp1c3RfZG90Zmls ZSk7CkBAIC00OCw2ICs0OSw3IEBAIG91ciAkVkVSU0lPTiA9ICdAVkVSU0lPTkAnOwogCiBv dXIgJExPQ0FMX0lHTk9SRV9GSUxFICA9ICcuc3Rvdy1sb2NhbC1pZ25vcmUnOwogb3VyICRH TE9CQUxfSUdOT1JFX0ZJTEUgPSAnLnN0b3ctZ2xvYmFsLWlnbm9yZSc7CitvdXIgJFJFTkFN RV9GSUxFID0gJy5zdG93LXJlbmFtZSc7CiAKIG91ciBAZGVmYXVsdF9nbG9iYWxfaWdub3Jl X3JlZ2V4cHMgPQogICAgIF9fUEFDS0FHRV9fLT5nZXRfZGVmYXVsdF9nbG9iYWxfaWdub3Jl X3JlZ2V4cHMoKTsKQEAgLTIzNCw2ICsyMzYsMTEgQEAgc3ViIGluaXRfc3RhdGUgewogICAg ICMgTi5CLjogZGlyZWN0b3J5IHRhc2tzIGFuZCBsaW5rIHRhc2tzIGFyZSBOT1QgbXV0dWFs bHkgZXhjbHVzaXZlIGR1ZQogICAgICMgdG8gdHJlZSBzcGxpdHRpbmcgKHdoaWNoIGludm9s dmVzIGEgcmVtb3ZlIGxpbmsgdGFzayBmb2xsb3dlZCBieQogICAgICMgYSBjcmVhdGUgZGly ZWN0b3J5IHRhc2spLgorCisgICAgIyAkc2VsZi0+e3JlbmFtZXNfZm9yfTogbWFwIGEgcGFj a2FnZSBuYW1lIHRvIHJlbmFtZXMgc3BlY2lmaWVkIGluIHRoYXQgcGFja2FnZSdzIC5zdG93 LXJlbmFtZQorICAgICMgRWFjaCBwYWNrYWdlIGhhcyBhIGhhc2ggb2YgcGFpcnMgcGF0ID0+ IHN1YnN0LCB3aGVyZSBwYXQgYW5kIHN1YnN0IGFyZSBzdWl0YWJsZSBzdHJpbmdzCisgICAg IyBmb3IgcGVyZm9ybWluZyBhIHN1YnN0aXR1dGlvbiBvZiB0aGUgZm9ybSBzL3BhdC9zdWJz dC8KKyAgICAkc2VsZi0+e3JlbmFtZXNfZm9yfSA9IHt9OwogfQogCiA9aGVhZDEgTUVUSE9E UwpAQCAtMzc5LDggKzM4Niw4IEBAIHN1YiBzdG93X2NvbnRlbnRzIHsKICAgICAgICAgbXkg JG5vZGVfdGFyZ2V0ID0gam9pbl9wYXRocygkdGFyZ2V0LCAkbm9kZSk7CiAgICAgICAgIG5l eHQgTk9ERSBpZiAkc2VsZi0+aWdub3JlKCRzdG93X3BhdGgsICRwYWNrYWdlLCAkbm9kZV90 YXJnZXQpOwogCi0gICAgICAgIGlmICgkc2VsZi0+e2RvdGZpbGVzfSkgewotICAgICAgICAg ICAgbXkgJGFkal9ub2RlX3RhcmdldCA9IGFkanVzdF9kb3RmaWxlKCRub2RlX3RhcmdldCk7 CisgICAgICAgIGlmICgkc2VsZi0+aGFzX3JlbmFtZXMoJHBhY2thZ2UpKSB7CisgICAgICAg ICAgICBteSAkYWRqX25vZGVfdGFyZ2V0ID0gJHNlbGYtPnJlbmFtZSgkcGFja2FnZSwgJG5v ZGVfdGFyZ2V0KTsKICAgICAgICAgICAgIGRlYnVnKDQsICIgIEFkanVzdGluZzogJG5vZGVf dGFyZ2V0ID0+ICRhZGpfbm9kZV90YXJnZXQiKTsKICAgICAgICAgICAgICRub2RlX3Rhcmdl dCA9ICRhZGpfbm9kZV90YXJnZXQ7CiAgICAgICAgIH0KQEAgLTc1Myw4ICs3NjAsOCBAQCBz dWIgdW5zdG93X2NvbnRlbnRzIHsKICAgICAgICAgbXkgJG5vZGVfdGFyZ2V0ID0gam9pbl9w YXRocygkdGFyZ2V0LCAkbm9kZSk7CiAgICAgICAgIG5leHQgTk9ERSBpZiAkc2VsZi0+aWdu b3JlKCRzdG93X3BhdGgsICRwYWNrYWdlLCAkbm9kZV90YXJnZXQpOwogCi0gICAgICAgIGlm ICgkc2VsZi0+e2RvdGZpbGVzfSkgewotICAgICAgICAgICAgbXkgJGFkal9ub2RlX3Rhcmdl dCA9IGFkanVzdF9kb3RmaWxlKCRub2RlX3RhcmdldCk7CisgICAgICAgIGlmICgkc2VsZi0+ aGFzX3JlbmFtZXMoJHBhY2thZ2UpKSB7CisgICAgICAgICAgICBteSAkYWRqX25vZGVfdGFy Z2V0ID0gJHNlbGYtPnJlbmFtZSgkcGFja2FnZSwgJG5vZGVfdGFyZ2V0KTsKICAgICAgICAg ICAgIGRlYnVnKDQsICIgIEFkanVzdGluZzogJG5vZGVfdGFyZ2V0ID0+ICRhZGpfbm9kZV90 YXJnZXQiKTsKICAgICAgICAgICAgICRub2RlX3RhcmdldCA9ICRhZGpfbm9kZV90YXJnZXQ7 CiAgICAgICAgIH0KQEAgLTgxNyw5ICs4MjQsOSBAQCBzdWIgdW5zdG93X25vZGUgewogICAg ICAgICBpZiAoLWUgJGV4aXN0aW5nX3BhdGgpIHsKICAgICAgICAgICAgICMgRG9lcyBsaW5r IHBvaW50cyB0byB0aGUgcmlnaHQgcGxhY2U/CiAKLSAgICAgICAgICAgICMgQWRqdXN0IGZv ciBkb3RmaWxlIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgICAgIGlmICgkc2VsZi0+e2RvdGZp bGVzfSkgewotICAgICAgICAgICAgICAgICRleGlzdGluZ19wYXRoID0gYWRqdXN0X2RvdGZp bGUoJGV4aXN0aW5nX3BhdGgpOworICAgICAgICAgICAgIyBBZGp1c3QgZm9yIHJlbmFtZXMg aWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAgaWYgKCRzZWxmLT5oYXNfcmVuYW1lcygkcGFj a2FnZSkpIHsKKyAgICAgICAgICAgICAgICAkZXhpc3RpbmdfcGF0aCA9ICRzZWxmLT5yZW5h bWUoJHBhY2thZ2UsICRleGlzdGluZ19wYXRoKTsKICAgICAgICAgICAgIH0KIAogICAgICAg ICAgICAgaWYgKCRleGlzdGluZ19wYXRoIGVxICRwYXRoKSB7CkBAIC0xMTk1LDYgKzEyMDIs NzAgQEAgc3ViIGdldF9hY3Rpb25fY291bnQgewogICAgIHJldHVybiAkc2VsZi0+e2FjdGlv bl9jb3VudH07CiB9CiAKKworc3ViIGhhc19yZW5hbWVzIHsKKyAgICBteSAkc2VsZiA9IHNo aWZ0OworICAgIG15ICgkcGFja2FnZSkgPSBAXzsKKyAgICBteSAkcmVuYW1lcyA9ICRzZWxm LT57cmVuYW1lc19mb3J9eyRwYWNrYWdlfTsKKyAgICAkcmVuYW1lcyA9ICRzZWxmLT57cmVu YW1lc19mb3J9eyRwYWNrYWdlfSA9ICRzZWxmLT5nZXRfcmVuYW1lcygkcGFja2FnZSkgdW5s ZXNzICRyZW5hbWVzOworICAgIHJldHVybiAkcmVuYW1lcyAmJiAlJHJlbmFtZXM7Cit9CisK K3N1YiBnZXRfcmVuYW1lcyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJHBh Y2thZ2UpID0gQF87CisKKyAgICBteSAlcmVuYW1lcyA9ICgpOworICAgIGlmICgkc2VsZi0+ e2RvdGZpbGVzfSkgeworICAgICAgICAkcmVuYW1lc3txci9kb3QtKFteLl0pL30gPSAnLiQx JzsKKyAgICB9CisKKyAgICBteSAkZmlsZSA9IGpvaW5fcGF0aHMoJHNlbGYtPntzdG93X3Bh dGh9LCAkcGFja2FnZSwgJFJFTkFNRV9GSUxFKTsKKyAgICBpZiAoLWUgJGZpbGUpIHsKKyAg ICAgICAgZGVidWcoNSwgIiAgVXNpbmcgcmVuYW1lIGZpbGU6ICRmaWxlIik7CisgICAgICAg ICVyZW5hbWVzID0gKCVyZW5hbWVzLCAkc2VsZi0+Z2V0X3JlbmFtZV9ydWxlc19mcm9tX2Zp bGUoJGZpbGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWJ1Zyg1LCAiICAkZmlsZSBk aWRuJ3QgZXhpc3QiKTsKKyAgICB9CisgICAgcmV0dXJuIFwlcmVuYW1lczsKK30KKworc3Vi IGdldF9yZW5hbWVfcnVsZXNfZnJvbV9maWxlIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0Owor ICAgIG15ICgkZmlsZSkgPSBAXzsKKyAgICBpZiAoIW9wZW4oUkVOQU1FUywgJGZpbGUpKSB7 CisgICAgICAgIGRlYnVnKDQsICIgICAgRmFpbGVkIHRvIG9wZW4gJGZpbGU6ICQhIik7Cisg ICAgICAgIHJldHVybiB1bmRlZjsKKyAgICB9CisKKyAgICBteSAlcmVuYW1lczsKKyAgICB3 aGlsZSAoPFJFTkFNRVM+KSB7CisgICAgICAgIGNob21wOworICAgICAgICBteSAoJHBhdCwg JHN1YnN0KSA9IHNwbGl0IC9ccyo9PlxzKi87CisgICAgICAgICRyZW5hbWVzeyRwYXR9ID0g JHN1YnN0OworICAgIH0KKyAgICBjbG9zZShSRU5BTUVTKTsKKyAgICByZXR1cm4gJXJlbmFt ZXM7Cit9CisKK3N1YiByZW5hbWUgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkg KCRwYWNrYWdlLCAkdGFyZ2V0KSA9IEBfOworICAgIHJldHVybiAkdGFyZ2V0IHVubGVzcyAk c2VsZi0+aGFzX3JlbmFtZXMoJHBhY2thZ2UpOworCisgICAgbXkgJXJlbmFtZXMgPSAleyAk c2VsZi0+e3JlbmFtZXNfZm9yfXskcGFja2FnZX0gfTsKKyAgICBteSBAcmVzdWx0ID0gKCk7 CisgICAgZm9yIG15ICRwYXJ0IChzcGxpdCBtey8rfSwgJHRhcmdldCkgeworICAgICAgICB3 aGlsZSAobXkgKCRwYXQsICRzdWJzdCkgPSBlYWNoICVyZW5hbWVzKSB7CisgICAgICAgICAg ICAkcGFydCA9fiBzLyRwYXQvc2FmZV9pbnRlcnBvbGF0ZSgkc3Vic3QpL2VnOworICAgICAg ICB9CisgICAgICAgIHB1c2ggQHJlc3VsdCwgJHBhcnQ7CisgICAgfQorICAgIG15ICRwYXRo ID0gam9pbiAnLycsIEByZXN1bHQ7CisgICAgCisgICAgcmV0dXJuICRwYXRoOworfQorCiAj PT09PT0gTUVUSE9EID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KICMgTmFtZSAgICAgIDogaWdub3JlCiAjIFB1cnBv c2UgICA6IGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gcGF0aCBtYXRjaGVzIGEgcmVnZXggaW4g b3VyIGlnbm9yZSBsaXN0CkBAIC0xMzMzLDYgKzE0MDQsOSBAQCBzdWIgZ2V0X2lnbm9yZV9y ZWdleHBzX2Zyb21fZmggewogICAgICMgTG9jYWwgaWdub3JlIGxpc3RzIHNob3VsZCAqYWx3 YXlzKiBzdGF5IHdpdGhpbiB0aGUgc3RvdyBkaXJlY3RvcnksCiAgICAgIyBiZWNhdXNlIHRo aXMgaXMgdGhlIG9ubHkgcGxhY2Ugc3RvdyBsb29rcyBmb3IgdGhlbS4KICAgICAkcmVnZXhw c3siXi9cUSRMT0NBTF9JR05PUkVfRklMRVxFXCQifSsrOworICAgICMgUmVuYW1lIGZpbGVz IGFyZSBhbHNvIG9ubHkgbG9va2VkIGZvciB3aXRoaW4gYSBwYWNrYWdlIGRpcmVjdG9yeSwg c28gdGhleQorICAgICMgdG9vIHNob3VsZCBhbHdheXMgYmUgaWdub3JlZC4KKyAgICAkcmVn ZXhwc3siXi9cUSRSRU5BTUVfRklMRVxFXCQifSsrOwogCiAgICAgcmV0dXJuICRzZWxmLT5j b21waWxlX2lnbm9yZV9yZWdleHBzKCVyZWdleHBzKTsKIH0K --------------CF01C75100A456E618761992-- --lUsOK6QPxK1k3pnOG0cKUEI9JQolHnRZD-- --B22dQb1XpjWXQQ0d1t2PxUCs7nzxSXnrN Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEEh1cg7YpFtZIpRvtmjreJ3fOr0kAFAlrZlfsACgkQjreJ3fOr 0kDw/w//WhPHc/0W3O5Nn1u3wfZn91VEsuTur7hfKOkdCBDw6WMRrCm3cYQ8GQ09 9y3dw/ooboQTkkWaLWacwEiouqnFfJQ/B/Qbb7687DCS4j0enh7zKX2unl/fY4cX 7Uh8lFIRI7ff4IldaO8P9ZR5Lw593CvYSvhEfdpXrDXsuMFIGpzcjfJyN6EHlYC5 M1zoXH5Itz7heGaf0oPe+PegDx9cMaIOVE1VgqSoo5etecWULyf5BsQZGAgHv3cS lcLwIJR5aoPZZDGmjHBpEqsBz+9Joj0Q3Ppb8RSUwvLsf/Ksa0AcO5huDa3sPgSJ QXf10mK00Pd2B1zBJ0V69MgSYJDbmj0tI3dSEyItY64lkTAwjcesY0OZa+M/vmCN BAHLjNje2jCJ/DtK5F4CD5rmMTmXSuOu1y1ATDslqzk4vqjfuzJQdOcHu6su3Frh pNAbMQ/YM9OlPpiByzpqmqeeMatv2Mp4ugHu/NX+T032zI65MmPxzOKPctVu72LH 0J7rjA9q/w0rLzyuztfvPNc1AsH1IsSMnw69XCmpvaCzhFc5Fi7ANQUIx7m4fAIr OYxH5Av/SUrcUfwE5GhTOqbLtH5Z0tGevi7GO7t+69rW4LRDoMP9BImYiGnA3cA9 tQPdWGKiFQKrYrNFCb6UkTxo1hPnfId3kpBGIWOJbsDmztVt/9k= =BqOC -----END PGP SIGNATURE----- --B22dQb1XpjWXQQ0d1t2PxUCs7nzxSXnrN--