[HN Gopher] When it comes to Git history, less is more
       ___________________________________________________________________
        
       When it comes to Git history, less is more
        
       Author : maximilianroos
       Score  : 172 points
       Date   : 2021-06-26 16:09 UTC (6 hours ago)
        
 (HTM) web link (brennan.io)
 (TXT) w3m dump (brennan.io)
        
       | foreigner wrote:
       | On this topic, is there a JavaScript lint tool that integrates
       | with Git to enable you to gradually apply style changes to code
       | as it evolves? E.g. if the change is tabs-to-spaces the lint tool
       | would require spaces in new or changed lines of code, but not
       | complain about tabs in unchanged lines of existing code.
        
         | jabo wrote:
         | You could have the linter only run on changed files in a
         | precommit hook, instead of on all files.
        
           | foreigner wrote:
           | That would work at file level granularity, but I'd like it to
           | work at line level.
        
             | masklinn wrote:
             | You can usually take the output of the lint tool and filter
             | it by the lines modified by the patch (which you get from
             | the diff).
             | 
             | Few tools do it out of the box (in the python world flake8
             | supports diff filtering out of the box, and there's diff-
             | cover which can filter analysis beyond just test coverage)
             | but it's easy enough to do with a wrapper, especially if
             | the linter has a configurable or even parseable (e.g. json)
             | output option.
        
             | jabo wrote:
             | Found an ESLint plugin that will only run on staged
             | changes: https://www.npmjs.com/package/eslint-plugin-diff
        
           | surfmike wrote:
           | This still leads to frustrating behavior, where changing one
           | line of a file might end up reformatting all of it (and this
           | often obscures the actual change itself).
        
             | klodolph wrote:
             | Tools like git-clang-format only reformat the code you've
             | changed, not the entire file. A lot of formatting tools
             | work this way (certainly not all).
        
             | jabo wrote:
             | There's an eslint plugin to run only on staged changes:
             | https://news.ycombinator.com/item?id=27643526
        
               | foreigner wrote:
               | That looks perfect.
        
               | onion2k wrote:
               | There's also the 'lint-staged' NPM package if you want to
               | do pretty much anything only on staged files.
        
         | foreigner wrote:
         | I guess one way this might work is the lint tool could run
         | against the whole file but then cross-check the line numbers of
         | any errors found with the git diff. If the diff shows the line
         | is unchanged then ignore the error. That doesn't sound too
         | hard.
        
         | FalconSensei wrote:
         | On IntelliJ, if you use the Save Actions plugin, you can set it
         | to only reformat lines that were changed. Although I'm not sure
         | if would work for using Prettier
        
           | scns wrote:
           | Thank you
        
       | daneel_w wrote:
       | What was the point the author tried to get across with the first
       | paragraph bringing up the large whitespace commit? It didn't add
       | anything to the story, it just ended up as an initial
       | distraction.
       | 
       | Also, is he implying that thousands of commits (one for each
       | file) would be a better way to convert that large code base? Why
       | not solve this problem with the right tools, such as ignorerevs?
        
         | ghshephard wrote:
         | The whitespace commit breaks cherrypicking. What seemed like a
         | harmless change could cripple automated backports of fixes. I
         | thought it was the entire crux of his story.
        
           | daneel_w wrote:
           | Yes but the whitespace commit - a change that unavoidably
           | affects almost every single line of its target - is possibly
           | the worst example one can come up with.
        
         | looperhacks wrote:
         | I believe his point is that the commit shouldn't have happened
         | at all, keeping the old style instead (or maybe applying the
         | new style together with other changes ... Yuck. Don't do this)
         | 
         | It kinda serves as a hook to describe why these changes are
         | bad. I think it's a good example for the rest of the article.
        
           | daneel_w wrote:
           | I feel it's a very contrived example because there's no
           | compromise to how such a change is to be done. If there's an
           | argument to make it's about making the decision to switch
           | whitespace tactic at all.
        
       | CalChris wrote:
       | What holds true for the Linux kernel may not hold true for other
       | repos.
       | 
       | In this case, the OP is supporting old Linux releases and
       | remarking how naturally cherry picking can work. LLVM by
       | comparison, doesn't have long-term stable releases. So this
       | conservative approach doesn't necessarily apply for LLVM.
       | 
       | So I like the analysis but I disagree with the generality.
        
         | mojolozzo wrote:
         | Agreed! The author makes exactly this point towards the end of
         | the post.
        
         | gumby wrote:
         | > So I like the analysis but I disagree with the generality.
         | 
         | Any organization that releases software revisions has this
         | issue. Yes, we do live in a world where much software is now
         | subject to "continuous release" (either applications which are
         | auto-updated to latest, on phones and some laptop OSes or web-
         | only applications where the latest is pushed to deployment).
         | And indeed the specific issue described here is much less
         | important.
         | 
         | However I suspect the majority of software in use is not like
         | that. On the Enterprise side, OSes and applications are updated
         | carefully; an ERP upgrade can be a major undertaking. All sorts
         | of machine control software is ether never upgraded, with
         | limited patching, or treated the same way as other enterprise
         | software. Etc.
         | 
         | The difference between the two is why there is both "git flow"
         | and "GitHub flow" -- it's not like one is absolutely superior
         | to the other.
        
       | pansa2 wrote:
       | > _The commit was about 10 years old, and it replaced every tab
       | with 4 spaces._
       | 
       | Reminds me of a project I worked on a while back - whenever you
       | looked at the git history of a file, if you went back far enough
       | you'd hit a dead end at the point where every source file was
       | renamed from *.c to *.cpp.
        
         | iveqy wrote:
         | --follow
         | 
         | We have a few files at work that change name with every
         | commit...
        
         | alkonaut wrote:
         | Git tracks changes across renames though right?
        
         | [deleted]
        
       | muxxa wrote:
       | git log -S'text of interest'
       | 
       | has always served me better than blame. It can better jump file
       | boundaries and find e.g. prior code that the code in question was
       | copied from.
       | 
       | I've always thought though that we need better conflict
       | resolution that is code aware. And also better changeset
       | specification, e.g. if a commit is equivalent to a s/foo/bar/
       | then this information should be included in the commit, or if a
       | function signature has changed, then record that fact, rather
       | than the dumb line by line diffs.
        
       | mananaysiempre wrote:
       | On one hand, I agree that these are all good points. I haven't
       | ever played with kernel code, but I have tried to backport years-
       | old Glibc commits and it's an absolutely miserable experience
       | because "minor" things like small-scale reformatting would
       | frequently be bunched together with unrelated changes. They also
       | maintained their configure script in version control and
       | apparently even merged it manually, because I've found that at
       | many points in its history it would be composed of pieces
       | generated by different versions of autoconf.
       | 
       | On the other hand, I don't think that the conclusions of this
       | story are as inevitable as it makes them seem. Much of the pain
       | it describes is due to the fact that Git is, as it proudly
       | itself, _stupid_ : it doesn't understand that your spacing or
       | line breaking or bracketing changes are incidental to what the
       | code is trying to accomplish. I'm not saying that structural or
       | otherwise language-aware editing or source control is the silver
       | bullet because I'm well aware that so far most attempts at it
       | suck, but I think it's important to remember that whitespace
       | pedantry is to a large extent a tooling issue.
       | 
       | Could a merge tool coupled less than completely to clang-format
       | (or yapf, or black, or gofmt ...) use its settings to improve the
       | merges, I wonder?
       | 
       | (Tangentially related: Monticello, Paredit, the "skeleton syntax
       | tree" idea from Dylan.)
        
         | laurent92 wrote:
         | Next generation of version control will diff the AST of the
         | parsed code, so line endings don't show up in the diff ;)
         | Bonus, developers will be able to each see the code with their
         | own code style or open a Java file in Scala ;)
        
           | mananaysiempre wrote:
           | I'd love for that to be true, but it's not like people
           | haven't had that idea before (if maybe not with source
           | control, because it's become ubiquitous only relatively
           | recently). Pushing code beyond a textual representation has
           | been _slooow_ and I haven't yet seen a breakthrough large
           | enough to change that.
           | 
           | The Scala thing isn't happening, though, -- it's a difference
           | of style and approach, not syntax.
        
         | breck wrote:
         | > so far most attempts at it suck
         | 
         | Agreed. I'm pretty sure I have it solved with Tree Notation
         | though. I've got a thing in the works which I call 3D git. Tree
         | languages get it for free. The trick was simplifying the syntax
         | so there's nothing left but space, and then your syntactic
         | shape matches the semantic shape.
         | 
         | A sneak peak:
         | 
         | https://twitter.com/breckyunits/status/1408546408911695873?s...
        
         | Ericson2314 wrote:
         | Yeah absolutely. My personal measure for a the "cohesion-
         | prowess" of a society is how much they screw around with plain
         | text, opaque binary data, etc. vs take the time to properly
         | create rich data structures for interfaces.
         | 
         | Taking the time and deep breath to write nice interfaces rather
         | than scrambling and putting all the effort into implementations
         | ignoring the larger picture of how human endeavors _compose_
         | seems very fundamental. It reminds me also of the slogan
         | 
         | > A developed country is not a place where the poor have cars.
         | It's where the rich use public transportation.
        
           | jolux wrote:
           | > > A developed country is not a place where the poor have
           | cars. It's where the rich use public transportation
           | 
           | This is brilliant, stealing it for my transit advocacy.
        
             | Ericson2314 wrote:
             | It is! Credit to
             | https://en.wikipedia.org/wiki/Gustavo_Petro
        
           | mananaysiempre wrote:
           | I'm not sure it's quite as clear-cut, for three reasons:
           | 
           | - Text (or binary) streams are the ultimate unnormalized
           | representation, and you don't always _want_ your data to be
           | normalized. When storing it, maybe (though I'm sure the DBAs
           | among us will disagree even on this point), but the
           | intermediate values during processing, almost certainly not.
           | 
           | - Most representations of structured values are all or
           | nothing, whereas in reality most types of structured data are
           | usually more conveniently viewed as having a hierarchy of
           | supertypes, possibly with things like "chunk of text" on the
           | top, maybe "list of chunks of text" below that, and so on;
           | otherwise your tools are much less reusable. (Compare
           | "generic programming" in the Haskell/Scala not Java/C# sense,
           | _i.e._ metaprogramming over algebraic datatypes not
           | parametric polymorphism. See also the "nanopass" approach to
           | compilers.)
           | 
           | These two (largely overlapping) points are how I explain to
           | myself the (empirically if not theoretically evident)
           | advantage of Unix's "getta byte" approach to IPC (as Cutler
           | sarcastically put it) over the myriads of structured
           | approaches that came before and after. By not structuring
           | your data exchange, it doesn't force you into a framework
           | that's more rigid than it needs to be. People barely
           | understand how to make structured data amenable to processing
           | by composable tools _now_ , back in the 80s I don't think
           | anybody even knew to ask the question.
           | 
           | This is why I mentioned Paredit and Dylan's "skeleton syntax
           | trees": they are, respectively, a structural editor and a
           | macro system that work where others fail by the virtue of
           | being expressed in terms of more than text or even tokens,
           | but less than a full syntax tree.
           | 
           | Finally, in this specific case,
           | 
           | - We're talking about programming languages, about making a
           | computer understand the programmer's intent to some degree.
           | This is a maze where making even the slightest wrong turn has
           | Godel and Turing together slapping you across the face with a
           | giant NOPE sign. It's kind of endearing to see the luminaries
           | on the Algol committee (essentially all of CS at the time)
           | state that they want, like, pseudocode, from their papers,
           | except, y'know, with a compiler, and not suspect anything can
           | go wrong with that. But we are hardly smarter than them, so
           | we should probably remember the bitter lessons they've been
           | forced to learn and keep in mind the possibility that there
           | might not _be_ a good solution to our problem.
        
             | Ericson2314 wrote:
             | > and you don't always want your data to be normalized.
             | 
             | I think "normalized" is doing a lot of work in this
             | sentence. In the context of data keeping, normalization
             | usually doesn't mean something like "like give a unit
             | vector", where they both have value and the normalization
             | is lossy, but rather cleanups of messy stuff that _ought
             | not to occurred in the first place_.
             | 
             | What I am saying is not the original input has no value,
             | but we should take the steps to make those problems
             | actually not happen in the first place. Rich interfaces do
             | that, and are an investment that pays for itself eventually
             | so this isn't manifestly unreasonable.
             | 
             | > ...metaprogramming over algebraic datatypes not
             | parametric polymorphism...
             | 
             | I worked on a little toy "tree editor" where we did just
             | that. The use of a good type system to both operate
             | "generically" without "upcasting" and loosing the structure
             | for ever is key.
             | 
             | > See also the "nanopass" approach to compilers.
             | 
             | I do like that a lot :) but I also like that there is an IR
             | for every pass, like with CakeML. I thought those went hand
             | in hand?
             | 
             | > (empirically if not theoretically evident) advantage of
             | Unix's "getta byte" approach to IPC
             | 
             | I would argue the (over-)prevelance of HTTP is effectively
             | empirically the opposite, namely that people do prefer
             | structured things in a vacuum, but coordination failures
             | have repeated gotten us stuck in local maxima of already
             | widely established things like Unix's various binary
             | streams and then HTTP.
             | 
             | > This is why I mentioned Paredit and Dylan's "skeleton
             | syntax trees": they are, respectively, a structural editor
             | and a macro system that work where others fail by the
             | virtue of being expressed in terms of more than text or
             | even tokens, but less than a full syntax tree.
             | 
             | I do agree the jump from text to sexprs / json / token
             | trees (Rust's name) etc. is the most important step. Fist
             | get rid of flatness, then worry about higher invariants.
             | 
             | > We're talking about programming languages, about making a
             | computer understand the programmer's intent to some degree.
             | 
             | And surely text doesn't help with that. Too much structure
             | makes some edits hard if the user can't temporarily mid-
             | edit ignore the rules, but computer should love it.
             | 
             | > It's kind of endearing to see the luminaries on the Algol
             | committee (essentially all of CS at the time) state that
             | they want, like, pseudocode, from their papers, except,
             | y'know, with a compiler, and not suspect anything can go
             | wrong with that.
             | 
             | This is about Algol 1968 not Algol 1960? My understanding
             | was that was too many features, not too many invariants.
        
       | zmmmmm wrote:
       | It reminds me that one of my grievances with whitespace
       | significant languages (hello Python) is that I _can 't_
       | effectively just skip commits that are pure whitespace changes in
       | code review. I am curious how people approach this ...
        
       | lilyball wrote:
       | It sounds like the real advice here is "have a strong coding
       | style guide that is rigorously enforced so nobody ever has to go
       | make style fixes to existing code".
        
       | pdw wrote:
       | > At a previous company, there was an "infamous" commit in our
       | main repository. The commit was about 10 years old, and it
       | replaced every tab with 4 spaces.
       | 
       | If have commits like this, add the ids to a file `ignorerevs`,
       | and then tell git about it:                  git config --local
       | blame.ignoreRevsFile ignorerevs
       | 
       | Then at least `git blame` will still give useful results. (This
       | is a relatively new git feature, added a year or two ago.)
        
         | forrestthewoods wrote:
         | Who gives a shit about a single commit that converts tabs-to-
         | spaces? How is this a problem in any way?
         | 
         | The real problem here is that "git blame" is a garbage tool.
         | Perforce has "timelapse view" that is radically better than any
         | historical view I've seen in Git/Hg.
         | 
         | With respect to this issue, git just needs to suck less.
        
           | xmprt wrote:
           | You answered your own question. Git blame is a pretty crappy
           | tool but it's a tool that a lot of people use nevertheless.
           | If you have a commit that converts tabs to spaces, then the
           | blame for pretty much every single line will be lost before
           | that point.
        
         | azernik wrote:
         | Just git blame -w to ignore whitespace. There's also an
         | equivalent git config option.
        
         | shepherdjerred wrote:
         | Wow, this is incredible! I convinced my team to adopt Prettier
         | for many of our repositories. The only real criticism was that
         | our git history would be cluttered since it would reformat all
         | of our code. This seems like the perfect solution.
        
         | catlifeonmars wrote:
         | Nice! Is there a way to check this into a repository (a la
         | .gitigore)?
        
           | banana_giraffe wrote:
           | You can specify a file with of such commits with --ignore-
           | revs-file, and of course check in that file. Naming that file
           | .git-blame-ignore-revs seems to be a convention I've seen
           | more than once.
           | 
           | Still need to specify the file yourself, so hopefully someone
           | can point out the missing magic to have git pull in .git-
           | blame-ignore-revs on its own.
        
             | NegativeLatency wrote:
             | A shell alias?
        
             | karlding wrote:
             | That's what the blame.ignoreRevsFile [0] config option is
             | for.
             | 
             | [0] https://git-scm.com/docs/git-config#Documentation/git-
             | config...
        
         | nickysielicki wrote:
         | Depending on the size of the team and how much agreement you
         | can get on the importance of such a change, I think the better
         | way to do this on an older repository is to get everyone to
         | nuke their checkouts and use git-filter-branch to rewrite the
         | history so that nobody ever used tabs.
         | 
         | https://stackoverflow.com/questions/58042532/how-can-i-clang...
        
           | Kinrany wrote:
           | git-filter-repo is now recommended over -branch by the docs
        
           | emmelaich wrote:
           | With the unfortunate side effect of invalidating external
           | refs for instance in your issue tracker or code review tool.
        
         | bhaak wrote:
         | 10 years ago would probably long enough ago to not care for me.
         | 
         | But wouldn't the standard -w be enough to ignore most of this
         | commit.
         | 
         | But I used ignoreRevs in repositories that messed up their
         | history by using an automatic indenter with atrocious settings.
        
           | gumby wrote:
           | Unfortunately -w won't help you with patch, which uses
           | character positions. But certainly helps with searching.
        
             | harikb wrote:
             | In addition, if their code is python, -w would incorrectly
             | ignore legitimate changes
        
               | jrochkind1 wrote:
               | do you have a realistic example?
        
               | contravariant wrote:
               | A simple one would be:                   total = 0
               | for value in list:            total += value
               | return total
               | 
               | vs.                   total = 0         for value in
               | list:            total += value         return total
        
           | tazjin wrote:
           | > 10 years ago would probably long enough ago to not care for
           | me.
           | 
           | Hm, especially for the case of blaming (mostly to figure out
           | why something was done a certain way) I frequently happen
           | upon 10+ year old commits. This happens both in open-source
           | projects, as well as at work (where we don't use git, but the
           | same concepts apply).
        
       | prpl wrote:
       | It would be cool if you could mark whitespace only changes at
       | least with an option to smart-skip them with `git blame` or
       | something
        
         | hnra wrote:
         | Isn't this possible with just the normal git blame -w? Or if
         | you want to ignore specific commits there is ignore-revs.
        
       | nailer wrote:
       | Storing changes as text is a fundamentally bad idea. Not only
       | does it make merge conflicts more likely to happen, as transforms
       | (me adding a function, you renaming something I use in the
       | function) more likely to occur, it also means that formatting is
       | committed and discussed rather than being a matter of personal
       | preference.
       | 
       | Hopefully the next item in this RCS CVS Subversion Git chain is
       | just storing ASTs and transforms on top of them so we can spend
       | less time fixing basic conflicts and discussing formatting.
        
         | _ix wrote:
         | I've seen the suggestion of VCS/SCM storing ASTs rather than
         | plaintext for a decade now. Are you aware of any projects that
         | are trying to address this?
        
           | arp242 wrote:
           | I heard Unison[1] does this, or something like it.
           | 
           | Never looked at it myself, so not an endorsement. Just came
           | up in the Lobsters discussion[2] on this last week where
           | someone mentioned it.
           | 
           | [1]: https://www.unisonweb.org/docs/tour/
           | 
           | [2]: https://lobste.rs/s/b9pddy/when_it_comes_git_history_les
           | s_is...
        
         | pjc50 wrote:
         | Does that mean git would have to support all known programming
         | languages, and any language syntax change would require a
         | backwards incompatible upgrade of the VCS?
        
           | nn3 wrote:
           | As well as any known config file formats.
        
           | globular-toast wrote:
           | More likely git would support a common AST format/protocol
           | and language tooling would be responsible for providing that.
        
         | iveqy wrote:
         | The way we store data is not the same as using that format to
         | solve conflicts. Take a look at semanticmerge.com
        
         | _ix wrote:
         | In a sibling comment, I was wondering about projects that are
         | trying ASTs. I haven't read deeply about it, but I recalled
         | that [pijul][1] might be a way forward.
         | 
         | [1]: https://pijul.com/manual/why_pijul.html#comparisons-with-
         | oth...
        
           | morelisp wrote:
           | Pijul's patch algebra, and storing diffs rather than
           | snapshots generally, makes it less amenable to these kinds of
           | experiments than Git. Changing your diff/merge strategy would
           | be akin to rewriting your entire project history.
        
         | breck wrote:
         | In Tree notation the text and ast have the same shape. You can
         | then have a semantic git
         | 
         | https://arxiv.org/pdf/1703.01192.pdf
        
         | luffapi wrote:
         | Not sure why you are downvoted. This is a genuinely interesting
         | idea and seems like the basis for next gen change management.
        
           | cellularmitosis wrote:
           | This isn't specific to VCS, but I'll drop a link to this
           | thread about structural editors which PaniczGodek has been
           | maintaining for a few years now, just to give it more
           | exposure:
           | https://twitter.com/PaniczGodek/status/1195784199250284545
        
           | morelisp wrote:
           | They are being downvoted for not understanding how git works.
           | If you have a 3-way diff/merge tool for ASTs you can plug it
           | into git and use it _today_ , and you can use it on all
           | existing branches and historical changesets.
           | 
           | The "problem" is no one actually wants to resolve merges that
           | way.
        
             | luffapi wrote:
             | There's been plenty of times my code as been "lost" in a
             | later commit because Git didn't know it was the same thing.
        
               | morelisp wrote:
               | I don't understand how this relates to what I said
               | without more details about what "lost" means, sorry.
               | 
               | If you mean Git had issues finding some specific code
               | motion to show in a diff, you can try one of the other
               | diff algorithms, or adjust the threshold for rename/copy
               | detection. AST-based differs would also suffer this
               | issue; a "nice diff" is not a formal problem and does not
               | have a universal solution.
               | 
               | If you mean you once had a mis-merge that dropped some
               | code you didn't want to drop, this won't go away with
               | AST-based diffs. It will just happen at the token level
               | instead of the line level.
               | 
               | If you mean it's generally hard to deal with collapsing
               | lots of branches with shared history, that's true but
               | would also be true with AST-based approaches. This is the
               | situation something like pijul could help with, but also
               | raises all the other tradeoffs of snapshot vs changeset
               | based approaches.
        
         | morelisp wrote:
         | Git stores snapshots, not diffs, and therefore could just as
         | well be considered storing ASTs. The trick is writing a useful
         | diff/merge for them. Programmers also don't think in ASTs,
         | arguably even less so than lines. The problem is not as formal
         | as it looks.
        
           | luffapi wrote:
           | There's great irony in someone who's name is "morelisp"
           | saying that programmers don't think in ASTs. Lisp syntax is
           | the AST.
        
             | morelisp wrote:
             | Which also means the Lisp _AST_ is not great to diff with.
             | 
             | First, it's too weak - you need to at least recognize
             | special top-level defun-style forms, or you'll generate
             | some minimal diff between two totally different functions
             | just because they both use the same cond pattern or
             | whatever.
             | 
             | Second, reader macros mean you can't really work on the
             | source AST in the first place, unless you also teach the
             | diff tool all your reader macros.
        
           | rwbhn wrote:
           | > Programmers also don't think in ASTs,
           | 
           | Citation needed
        
             | morelisp wrote:
             | T_PAAMAYIM_NEKUDOTAYIM
        
       | cellularmitosis wrote:
       | It is a shame that we don't have better tools, and that we are
       | still hand-editing text files in order to write programs.
       | 
       | Imagine having an editor which automatically applied your local
       | preferences around tabs/spaces, code formatting, variables up top
       | vs nearest use, function definitions nested to minimize top-scope
       | surface area vs all functions flat at top scope, etc etc etc
       | 
       | And when you are done editing, all of these local changes are
       | reversed and you submit the minimal possible diff.
       | 
       | (and if we want to really talk pipe dreams, the dev only sees an
       | AST editor and the underlying text is never even exposed in the
       | first place)
       | 
       | Our tools are so far behind mostly because everyone's thinking is
       | still chained to 1970's hand editing text files mentality. This
       | is the flying car which isn't being worked on because everyone is
       | still thinking about making better bicycles.
        
         | ajuc wrote:
         | The benefit is minimal, the task is hard, there's decades worth
         | of tools that won't work, and it's easy to mess up introducing
         | "impossible bugs" with behind-the-scenes transformations.
         | 
         | Also - AST isn't THAT important when reading the code. Let's
         | say I give you this:                   X (X X X X; X X X; X X)
         | {             X (X X X) {                X(X X X X X)
         | }         }
         | 
         | Do you know what this code does? How about this:
         | for int i = 0 i < 10 i ++ if i % 2 printf " %d " , i
         | 
         | I've used several graphical languages professionally (not AST-
         | based, graph-based, but the problem remains) and the main
         | problem was - structure wasn't fully describing what happens -
         | the "meat" of the behaviour was still in text form and was
         | hidden behind the pretty graphic form - in case of both of
         | these languages the meat was in the names of the subprocesses
         | called and in the mapping of process variables <-> subprocess
         | parameters.
         | 
         | And there were A LOT of these, so you couldn't show them at
         | once on the same screen as the graphical view of the process.
         | So programming with both of these languages was very
         | frustrating - you had to click on each node and look through
         | long lists of x:y substitutions to track how parameters flow
         | through the system.
        
         | spaetzleesser wrote:
         | Agreed. It seems silly that we still have to deal with things
         | like tabs vs spaces or formatting in different ways. This
         | should be handled by IDEs and editors.
        
         | al2o3cr wrote:
         | Our tools are so far behind mostly because everyone's
         | thinking is still chained to 1970's hand editing text
         | files mentality.
         | 
         | People IN THE LITERAL 1970s were talking about this exact idea.
         | We still don't have this, for anything other than highly-
         | specialized applications (for instance, equation editors in
         | word processors).
         | 
         | It's almost like it's way, way, way harder to deliver software
         | than it is to handwave about how much better things would be if
         | people just listened to YOU.
        
         | cjfd wrote:
         | AST editting would be kind of okay. But never better than kind
         | of okay. Thoughtfully formatted text can be quite a bit nicer.
         | 
         | Also, cities where one can get around on bicyles are much nicer
         | than where one needs to use cars. Flying or otherwise.
         | https://www.youtube.com/watch?v=ul_xzyCDT98
         | 
         | To summarize both points: what looks like progress
         | superficially may actually not be progress at all.
        
       | spankalee wrote:
       | This isn't good general advice. The vast majority of projects
       | aren't going to need to cherry pick commits to such old branches,
       | and overly limiting style fixes and refactorings is a good way to
       | ossify a code base.
        
         | cypressious wrote:
         | This is exactly what the author is saying in the final
         | paragraph.
        
         | sharken wrote:
         | The same problems exist when you merge between multiple release
         | branches, there is an inherent resistance to refactoring as it
         | interferes with merges.
         | 
         | To me the solution is to migrate to trunk based development and
         | hide new features behind feature flags.
         | 
         | The biggest issue with this transformation seems to be
         | implementing feature flags in the code.
        
       | geofft wrote:
       | I agree with the author re Git as it exists right now, but this
       | feels like an unsolved technical problem that ideally should be
       | handled in your VCS than something to be worked around by social
       | conventions not to do cleanups.
       | 
       | git blame, for instance, has the "--ignore-revs" and "--ignore-
       | revs-file" options which let you specify some commits that can be
       | ignored. This is a little helpful for the sort of code spelunking
       | the author does (which I do very frequently), but it's a manual
       | process. There's no built-in convention to Git for what this file
       | should be named and how to have git blame pick it up
       | automatically. Moreover, you have to create the commit in order
       | to know what its revision is, which means that in squash/rebase
       | workflows, you have to land the style cleanup on the target
       | branch and only then can you add it to the ignore list.
       | 
       | One option that occurs to me is a special marker string to put in
       | the commit message like "Git-Ignore-For-Blame: yes" or something.
       | I'm not sure if there's a better way to do it.
       | 
       | More generically, if the commit is _only_ swapping out tabs and
       | spaces,  "git blame -w" ought to take care of it. For more
       | involved reformatting, git diff and git merge both have "ignore-
       | all-space" modes, which will handle things like line breaks.
       | 
       | But really what you want for blames and cherry-picks, I think, is
       | blames at the _syntax_ level. The Git commands only know about
       | lines - git blame runs on lines, git cherry-pick constructs diffs
       | based on lines and tries to re-apply them, etc. But at the
       | repository level there 's nothing special about line breaks. Why
       | can't we run git blame or cherry-pick on an AST, so that it
       | operates regardless of formatting?
       | 
       | Are there tools that do this? (They don't need to be built into
       | git; a third-party tool ought to be able to do this just fine.)
        
         | bsmedberg wrote:
         | In theory you can plug any three-way merge tool into git. I'd
         | love to see merge tools that are syntax aware and can merge
         | asts more than line text.
        
         | a-dub wrote:
         | i think what you (and the OP) are describing goes beyond making
         | merges more robust to nonfunctional changes by using something
         | like an AST representation. making text edits apply cleanly is
         | one part of the problem, but as the OP notes, the harder part
         | of these merges is actually when interfaces stay the same but
         | behavior changes. i think that to solve that, you'd need some
         | kind of static analyzer that could jump from changed
         | lines/syntax to execution paths and then to diffs of them.
         | 
         | i bet there are some cool papers out there on trying to do
         | this... but, this is essentially a restatement of the halting
         | problem, so building something that is guaranteed to be correct
         | using only static analysis may be impossible. (but this does
         | not preclude a solution that might be good enough)
        
           | catlifeonmars wrote:
           | Well in an ideal world, Liskov's substitution principle
           | applies and you only ever care about interface changes.
        
             | catlifeonmars wrote:
             | I'm this same world, you don't make breaking changes
             | without a new version of the interface. I like living in
             | fantasy land :)
        
       ___________________________________________________________________
       (page generated 2021-06-26 23:00 UTC)