[HN Gopher] Show HN: Stamp turns a folder into a plain text file... ___________________________________________________________________ Show HN: Stamp turns a folder into a plain text file and a file into a folder Author : breck Score : 140 points Date : 2021-02-07 16:31 UTC (6 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | RBerenguel wrote: | Oh, this looks similar to my "motllo" project, [1] (and so many | other projects, mine wasn't the first either). I have variable | substitution, but no additional logic. For me the point was | having a "readable" representation of the template. | | [1]: https://github.com/rberenguel/motllo | h_anna_h wrote: | If you do not want to install a npm package for this you can use | tar -cv file | base64 | | It also supports compression! tar -cv --gzip file | | base64 | | Sadly it is not human readable, unlike this utility. | nabla9 wrote: | If it needs to be plain text there shar command (shell | archieve). | | It was used to send text file attachments. | chrissnell wrote: | ^ this | | I remember telnet-based installers back in the early 1990s | that used the pipe-to-sh truck along with shar archives to | install things like IRC clients onto your workstation. | icedchai wrote: | "uuencode" was also used in the Usenet days. | mappu wrote: | Tar files are human readable - file names, sizes, mtime and so | on are all in ASCII text numerals, immediately preceding each | file's content. | | Maybe not human writable, there are some \x00 bytes used for | padding. | macqm wrote: | I have a couple questions: | | Why should I use your tool vs. a one line bash script for | creating a directory tree? | | Why would I keep any file content in the stamp file, in the | version control history, if I can keep, say a bootstrap | repository with some "templates" and check them out without | history (git archive, git checkout-index). | danielovichdk wrote: | I am sure it has been fun to do. But I would leave it at that. | | I don't understand the use cases at all. The downsides you | mention totally misses the point because it lacks to mention | every upside. | | In my world, if I wish to share anything remotely programmable it | goes into a Git repo. | | I don't use zip for anything else that if I must share something | over an email. | | What am I missing here? | Zababa wrote: | This seems to be one of the project of Tree Notation [1], which | was discussed in the context of Dumbdown, a Markdown alternative | [2]. | | [1]: https://treenotation.org/ | | [2]: https://news.ycombinator.com/item?id=25848204, | https://news.ycombinator.com/item?id=20856525 | icegreentea2 wrote: | Tree notation looks fun... I was reading what I think is the | spec (https://github.com/treenotation/blog.treenotation.org/blo | b/m...)? I honestly can't make quite heads or tails of it, but | I do get an sense that giving cells 2D size is important. Then | I looked at the language examples and... none of them seem to | really use this idea of cell size?? | | Am I missing something? | benjaminjackman wrote: | This is pretty cool. | | Expanding a bit this would be great in an IDE, Often I have | wanted to simply select a bunch of files and edit them at once | (maybe with a special temporary comment between them) as a single | file then save the changes back to the individual files. Would be | nice if that was a right click context menu item or bindable | command. | | In C(++) land I could see it being extremely useful for h/c(pp) | juggling if the IDE automagically did the combining. | | Finally being able to write the comments that separate the files | as I type would be really nice when prototyping out new code you | want all together before you split it up. | | Also perhaps if its common enough certain meta files that | describe link other files together could be left as shortcuts in | the repo. When you open those the files (or portions of files) | they reference are opened for editing. | xixixao wrote: | I built this a long time ago: | | https://github.com/xixixao/many-to-one | benjaminjackman wrote: | I've never seen that before, looks really neat, I'll have to | try it out. Thanks. | hawski wrote: | It would be interesting to generate HTML as an output. This way | it could inline text files, images (data URI), videos, audio and | other files as <a href="data:application/octet-stream;base64,... | download="filename.ext" ... You could get mime types from file(1) | not to put octet-stream everywhere. | | Basic version wouldn't even need a single JS line. | | Sounds like a good little weekend project. | imhoguy wrote: | I think diff & patch already serve us well for a few decades. | teknopaul wrote: | This is very much a solved problem. | | Wierd people can think this is something that the grey beards | didn't ever think of between 1970-01-01T00:00:00 and today. | JoeAltmaier wrote: | Its seems a kind of relation, where 'parent directory' can be any | string e.g. a file name. Cool. But I'd much rather just have a | relational way of looking at my data objects and metadata, | without this ancient, obsolete notion of 'folders'. | LordDragonfang wrote: | I'm wondering what OS you're using where folders are | "obsolete". It feels like you've missed the use case here. | noobermin wrote: | As someone who does a lot a "roll your own" programming as a | scientist, I never got the appeal of overly nested directories in | web dev and other fields, it feels a lot like it make things more | complicated at least for small projects like the very example | they show here. Might as well just have a single directory for | three files. | | Reminds me a lot like OOP examples in tutorials that make a class | that only has two methods, too much boilerplate. Like OOP it | becomes useful for large systems (GUI libraries) but it's | overkill when you have less than ten files I think. | | EDIT: too late to edit but what I mean in the end of the last | sentence is directory structure, not OOP, that less than ten | files can be in a single dir without confusing people (or me at | least). | yourapostasy wrote: | _> ...I never got the appeal of overly nested directories in | web dev and other fields..._ | | This is often a side effect of many competing interests trying | to cram their incentives into a single ontology and then | taxonomy. No strong consensus (or a lack of highly opinionated | direction) to shape a single concise ontology and taxonomic | implementation, so Design By Committee creeps into the | decision-making, and creates enough branching to satisfy the | "gotta catch them all"-itis to capture all the requirements. | | That in turn is usually a side effect of the business not | knowing its domain sufficiently well to articulate to a | granular-enough detail the implementation priorities, and | improperly punting that decision to the development | organization. "We need this requirement for sure that will as a | result prioritize the domain under this ontology. No, wait, we | need that. No, wait, we need both even though they are | overlapping but mostly disjoint ontologies, and in some places | contradictory...." | | Which finally, is usually in turn a side effect of people | leaders managing by KPI's instead of leading teams, to produce | results that happen to affect KPI's as a happy side effect. | Which is probably where the "leadership that comes up through | the ranks is best leadership" comes from, because we often do | not find leaders who embody that "lead the teams not the KPI's" | characteristic without the deeply-internalized knowledge of the | domain acquired by such arduous, time-consuming work over years | and often decades within the domain. | | It's a tough abstraction stack to deal with for everyone | involved. There are good solutions, just not quick and cheap | ones of course. | sdfhbdf wrote: | Cool seems like unix `cat` command with addition of storing the | filepath (so maybe like `find`?) | | While this of course sound like a cool project and my comment | might be the most Hacker News-y thing [1] I think it's aimed at | developers and so it fits. | | I don't agree with the zip downsides listed in the repo since | firstly `unzip -l` exists to see what's in a zip and secondly the | argument with reuploading the zip doesn't work in favor of a | different format since you also need to update it in a remote | when changed. | | Secondly I am kind of amused about this format when `touch`, | `mkdir -p` and `echo` are available in every POSIX compliant | system which can be combined to create a nice coherent shell | script which without dependencies would cover the functionality | of this project as far as I understand. | | I don't want to sound condescending but I'm a feeling a little | left-pad [2] on this one. | | [1]: https://news.ycombinator.com/item?id=9224 | | [2]: https://www.davidhaney.io/npm-left-pad-have-we-forgotten- | how... | Sharlin wrote: | > Cool seems like unix `cat` command with addition of storing | the filepath | | Like `patch`, then? | sdfhbdf wrote: | Right, I didn't even consider that we've gone full circle to | git. | tyingq wrote: | It seems very comparable to "shar"...shell archives. | | https://en.wikipedia.org/wiki/Shar | masklinn wrote: | shar is specifically mentioned in the footer, with the | drawback that it's really an arbitrary shell scipt. ptar is | also mentioned, and seems rather nice. It's also way better | documented[0] though with glaring holes e.g. how does it deal | with non-UTF8 file content (it's not clear whether file size | or delimiters is relevant, and why you'd have a closing | delimiter if the filesize rules), it also specifies file | names as UTF8 or ASCII, neither of which is sufficient to | handle the full breadth of possible file names. | | [0] https://github.com/jtvaughan/ptar/blob/master/FORMAT.md | hamburglar wrote: | There are file names that can't be expressed as UTF8? I'm | intrigued. | fwip wrote: | The main benefit, in my mind, over zip/tar is the built-in | parameter substitution. | | You could imagine using this as a development dependency, to | standardize the creation of new (anything) that follows a | predictable pattern. Check in your stamp file, and any junior | dev who creates a new [anything] in your project can get all | the custom boilerplate and best-practices right away. | sdfhbdf wrote: | So like `sed` or `mv` ? | [deleted] | supermatt wrote: | I think the main takeaway over zip is that with zip you need to | actually run "zip" before committing whereas here you can | declare it in "code". I don't see the benefit over shipping a | skeleton directory though. | layer8 wrote: | Yes, the only real advantage over zip files seems to be the | parameter substitution. I'd rather build that on top of the zip | format, which supports extension by custom fields, and provide | a wrapper around zip/unzip that adds the substitution | functionality. Users of regular zip could still use the zip | files then, just without automatic substitution. | anomaloustho wrote: | I see this as a declarative vs imperative approach. The | interface is a bit barebones and heavy right now by needing to | fire up node and run the functions. But like declarative vs | imperative DevOps, the declarative nature of the resulting | format seems like it can carry a lot of the same benefits. | | POSIX scripting and other tools are a viable alternative as | well. Though despite knowing all of the commands you've | mentioned, and regularly sharing/applying git patches, I think | I would still have difficulty renaming FileA to FileB in a | tarball or patch prior to unpacking or applying it. | | The declarative approach seems like a nice feature that greatly | reduces the cognitive friction there. But as a single feature, | it's not clear whether it's worth a tool change. | theamk wrote: | I prefer to use shell scripts for that, this works pretty well | and is very readable: cat >README <<'EOF' | This is a README EOF # This is a comment | mkdir -p myProject cat >myproject/index.js <<'EOF' | console.log("Hello world") EOF | | it does not require any tools to extract either. (and if you | omit quotes around EOF, you can do substitutions) | MY_EMAIL=put-your-email-here cat >config <<EOF | email=$MY_EMAIL EOF | thaumaturgy wrote: | I use this pattern a lot along with a tool I built for doing | server deployments and administration using plain old shell | scripts and ssh (golem: | https://github.com/robsheldon/golem/). | | There are two caveats: | | First, if there's any chance at all that the heredoc may | contain a $, or a `, or possibly some other shell-magical | characters, then you have to use a single-quoted heredoc: | cat <<'EOF'... | | This means that if you want to do variable interpolation, | like you're doing, then you need something that looks like: | cat <<'EOF' | sed -e "s/\\\$username/$username/g" -e | "s/\\\$my_email/$my_email/g" ... | | It looks yucky and unwieldy at first, but I've found that | it's nice to be able to see at the top of the heredoc exactly | what's getting replaced and what values it needs. | | Second, if root privileges are required to write the file, | then you need to use `tee`, because you can't sudo an output | redirection: cat <<'EOF' | sed -e | "s/\\\$username/$username/g" | sudo tee /path/to/file | >/dev/null | | After using it for a while, I've found I _really_ like this | pattern for managing configuration file templates. | | You're right though that something like Stamp could be built | using standard shell tools if someone were so inclined. | waheoo wrote: | https://www.gnu.org/software/gettext/manual/html_node/envsu | b... | lsmurray wrote: | Why don't you write it with posix only tools then? It's a great | idea that didn't exist yet. Who cares how the developer made | it? I'm sure if it takes off people will rewrite it in go and | rust with standalone binaries and the HN crowd will love it. | I'm pretty sure people use the tools they're most familiar | with. Bashing people for their choice of tool is a popular | comment on HN but doesn't accomplish anything. | sdfhbdf wrote: | It's not bashing a tool per se, sorry if you read it as such. | I was pointing out that with the abundance of tools we have | at our disposal this project sounds to me like a solution | looking for a problem. | | As for the solution not existing yet - as people pointed out | there is tar, zip, git, and shar which all seem to accomplish | the same thing | BoorishBears wrote: | Did you read the very thorough rationale provided by the | project page, complete with pro-cons for many other | methods? | | I have no idea how someone could read such a thorough | README and say "this sounds like a solution looking for a | problem" with a straight face. | sdfhbdf wrote: | Yes I read it and I don't agree with the posted downsides | for most of them, since the tool itself seems to share | the downsides with the posted pro-cons of other solutions | and doesn't seem to solve any problem it promises to do. | | Is visibility into what's being created a problem? | | The listed problems like "everytime the template changes, | author has to rezip and reupload the folder" don't seem | to be solved with stamp to me, it seems like the problem | is now shifted to controlling a version of this new | format and still distributing it somehow (probably | through git) at which point you ask yourself why can't | the git repo already have the structure? If somebody | wants to rename something they do this really easily, no | need for var substitution. | | If there was a migration mechanism that would move files | from an old template to a new one I would see value | added. | iudqnolq wrote: | The difference is you can directly edit the file in a | text editor (possibly even in the github ui) instead of | needing to unzip, edit, and rezip. | | It makes find and replace across all files trivial with | your editor, whereas that would be less fluid with a zip. | dmd wrote: | I feel like having a tool for this - which you need to download | and run - is rather overkill compared to a bunch of mkdir and | echo commands in a shell script. You could call it a 'shell | archive'. | | You could even write a tool to make these for you - and you | wouldn't need anything but a shell to expand it. Maybe call the | tool 'shar'. | jedberg wrote: | Instead of all the snark you should have just included a link: | | https://en.m.wikipedia.org/wiki/Shar | zepto wrote: | I generally am against snark, but I think that in this case | it communicated something quite useful about how we can go | through the same thought process that resulted in a tool that | has existed forever, and not realize we have just reinvented | it. | fwip wrote: | They mention shar in the readme: | | > shar (https://en.wikipedia.org/wiki/Shar) - old school method | that has the major security flaw of potentially running any | shell command | nulbyte wrote: | Incidentally, this is exactly the behavior on which this | project relies: | | > #! /usr/local/bin/node --use_strict /usr/local/bin/tree | | This has additional dependencies. I don't see much of a | benefit here. | fwip wrote: | Disclaimer: I've never used this tool, today is the first | time I've heard about it. | | Reading the shebang of a stamp file is a lot easier than | scanning a bash file for any sneaky obfuscations (including | any custom logic that the author may have "helpfully" | included). | | Alternately, the security-conscious can execute it directly | as `node --use_strict /usr/local/bin/tree my.stamp`. | [deleted] | sdfhbdf wrote: | What about files with different encodings? Which of them is used? | UTF-8? Same question about line endings | | And how does it deal with files that have strict whitespace | requirements like python or Yaml? Can it reliably restore each | tab and space? | captainmuon wrote: | This brings back memories of an ancient program called "patchy" | that I encountered during my PhD. | | Fun story, I was one of the last students doing his PhD at the | Tevatron, a large particle accelerator near Chicago, before | everybody's attention moved to the LHC. Our collaboration was | winding down, and close to the end of my thesis I realized that | there was nobody producing the simulations that I needed anymore, | so I had do it all myself. The first step was building the | software. One program I used has been maintained by the same guy | since the 70s, and you could see the accretion of layer upon | layer as new scientific models got added to the program, but it | was never rewritten. The code itself was in glorious FORTRAN 77, | and to compile it you needed the aforementioned patchy. A patchy | file is a plain text archive of all your source files much like | in OPs stamp. In addition, you can add directives to each file to | do a primitive form of conditional compilation (e.g. to include | certain models, or to run on AIX). | | I really wanted to use this one program because it could simulate | things no other program could do. But the biggest hurdle was | actually compiling patchy, which required a specific version of | CentOS, CERNLIB, two decades worth of patches on top, and a crazy | bootstrapping procedure. I especially recall a manual for patchy, | which proudly talked about laying a software foundation for the | soon to be built "superconducting super collider" in Texas (which | was cancelled while I was still in elementary school). The | episode made me realize how deep the stacks are sometimes behind | the legacy software that we use. | [deleted] | Kwpolska wrote: | Regarding the project templates, did you look at Cookiecutter | [0]? There are over 5k projects that GitHub finds that use it | [1]. It solves the "custom utility" problem, since it can be used | with multiple templates. I can just install `cookiecutter` and | immediately use any of the 5k+ templates, and I get variable | substitution, and some basic logic in the code. I also don't need | any special structures -- I prefer 4-space tabs, and to write or | edit the `stamp` file manually, I would need to remember how to | tell vim to disable all indentation support, since I'd have | tabstops at 1 (the `data` line), 2 (top-level code), 6 (one level | of indentation), 10, ... | | [0]: https://cookiecutter.readthedocs.io/en/1.7.2/ [1]: | https://github.com/search?q=cookiecutter&type=Repositories | qbasic_forever wrote: | Cookiecutter is nice but it requires an entire python install | to run, which is a big thing to ask for some of the scenarios | mentioned by the tool creator (like someone going through a | simple learning tutorial which might not even be using python | at all). | | IMHO gomplate is a nicer alternative that's just a single | static go-based tool that can do everything cookiecutter does | and a lot more: https://github.com/hairyhenderson/gomplate | adrianmonk wrote: | Another alternative for something like this would be MIME | multipart/mixed | (https://en.wikipedia.org/wiki/MIME#Multipart_messages). | | That allows a text file to contain several other files. Plain | text files can be included as-is (as text/plain), and binaries | can be included (as application/octet-stream). Each file can be | given a name through 'Content-Disposition: filename="foo.txt"'. | | It can be hand-edited if you're reasonably careful. (Use | boundaries, not Content-Length.) | | And if any of the files would have been mergeable (with Git, | etc.) as a separate file, it should also be pretty mergeable as a | section of a MIME file. (Because it is included literally, and | because presumably you give each one a unique filename, so the | merge/diff algorithm has a unique Content-Disposition line to | work with for each file.) | grenoire wrote: | Maybe I missed it: What happens to binary data? | breck wrote: | Good question. Base64? I forget if I added support for that. ___________________________________________________________________ (page generated 2021-02-07 23:00 UTC)