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--