<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: chipx86</title><link>https://news.ycombinator.com/user?id=chipx86</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 14 May 2026 02:02:51 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=chipx86" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[Modernize Your Punch Card Review with Review Board]]></title><description><![CDATA[
<p>Article URL: <a href="https://www.reviewboard.org/punch-cards/">https://www.reviewboard.org/punch-cards/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47604586">https://news.ycombinator.com/item?id=47604586</a></p>
<p>Points: 5</p>
<p># Comments: 1</p>
]]></description><pubDate>Wed, 01 Apr 2026 18:22:22 +0000</pubDate><link>https://www.reviewboard.org/punch-cards/</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=47604586</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47604586</guid></item><item><title><![CDATA[New comment by chipx86 in "CSS now has an if() conditional function"]]></title><description><![CDATA[
<p>I'm pretty happy to see this, as conditionals can really help keep code manageable when trying to define CSS variables or other properties based on combinations of light mode, dark mode, high-contrast, contextual state in a document or component, etc.<p>if() isn't the only way to do this, though. We've been using a technique in Review Board that's roughly equivalent to if(), but compatible with any browser supporting CSS variables. It involves:<p>1. Defining your conditions based on selectors/media queries (say, a dark mode media selector, light mode, some data attribute on a component, etc.).<p>2. Defining a set of related CSS variables within those to mark which are TRUE (using an empty value) and which are FALSE (`initial`).<p>3. Using those CSS variables with fallback syntax to choose a value based on which is TRUE (using `var(--my-state, fallback)` syntax).<p>I wrote about it all here, with a handful of working examples: <a href="https://chipx86.blog/2025/08/08/what-if-using-conditional-css-variables/" rel="nofollow">https://chipx86.blog/2025/08/08/what-if-using-conditional-cs...</a><p>Also includes a comparison between if() and this approach, so you can more easily get a sense of how they both work.</p>
]]></description><pubDate>Fri, 05 Dec 2025 09:31:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=46158936</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=46158936</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46158936</guid></item><item><title><![CDATA[New comment by chipx86 in "Ask HN: Abandoned/dead projects you think died before their time and why?"]]></title><description><![CDATA[
<p>Love seeing this one. My uncle was co-founder of Quarterdeck, and I grew up in a world of DESQview and QEMM. It was a big influence on me as a child.<p>Got a good family story about that whole acquisition attempt, but I don't want to speak publicly on behalf of my uncle. I know we've talked at length about the what-ifs of that moment.<p>I do have a scattering of some neat Quarterdeck memorabilia I can share, though:<p><a href="https://www.dropbox.com/scl/fo/0ca1omn2kwda9op5go34e/ACpO6bz7nNFM8b9yzn4mS_o?rlkey=kyeiljpm7d2l7q5nvvuzbi6wc&dl=0" rel="nofollow">https://www.dropbox.com/scl/fo/0ca1omn2kwda9op5go34e/ACpO6bz...</a></p>
]]></description><pubDate>Sun, 12 Oct 2025 06:41:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=45555850</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=45555850</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45555850</guid></item><item><title><![CDATA[New comment by chipx86 in "Use keyword-only arguments in Python dataclasses"]]></title><description><![CDATA[
<p>This is a great feature for those who want a mix of positional and keyword-only arguments.<p>I should have mentioned originally (and I've since updated my post) that this and the kw_only= flag both require Python 3.10 and higher, so code that works with older versions can't opt into it yet.</p>
]]></description><pubDate>Mon, 30 Jun 2025 19:39:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=44427047</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44427047</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44427047</guid></item><item><title><![CDATA[New comment by chipx86 in "Use keyword-only arguments in Python dataclasses"]]></title><description><![CDATA[
<p>That's annoying for sure. Though a different problem.<p>All the kw_only=True argument for dataclasses does is require that you pass any fields you want to provide as keyword arguments instead of positional arguments when instantiating a dataclass. So:<p><pre><code>    obj = MyDataclass(a=1, b=2, c=3)
</code></pre>
Instead of:<p><pre><code>    obj = MyDataclass(1, 2, 3)  # This would be an error with kw_only=True
</code></pre>
The problem you're describing in boto3 (and a lot of other API bindings, and a lot of more layered Python code) is that methods often take in **kwargs and pass them down to a common function that's handling them. From the caller's perspective, **kwargs is a black box with no details on what's in there. Without a docstring or an understanding of the call chain, it's not helpful.<p>Python sort of has a fix for this now, which is to use a TypedDict to define all the possible values in the **kwargs, like so:<p><pre><code>    from typing import TypedDict, Unpack


    class MyFuncKwargs(TypedDict):
        arg1: str
        arg2: str
        arg3: int | None


    def my_outer_func(
        **kwargs: Unpack[MyFuncKwargs],
    ) -> None:
        _my_inner_func(**kwargs)


    def _my_inner_func(
        *,
        arg1: str,
        arg2: str,
        arg3: int | None,
    ) -> None:
        ...
</code></pre>
By defining a TypedDict and typing **kwargs, the IDE and docs can do a better job of showing what arguments the function really takes, and validating them.<p>Also useful when the function is just a wrapper around serializing **kwargs to JSON for an API, or something.<p>But this feature is far from free to use. The more functions you have, the more of these you need to create and maintain.<p>Ideally, a function could type **kwargs as something like:<p><pre><code>    def my_outer_func(
        **kwargs: KwargsOf[_my_inner_func],
    ) -> None:
        ...
</code></pre>
And then the IDEs and other tooling can just reference that function. This would help make the problem go away for many of the cases where **kwargs is used and passed around.</p>
]]></description><pubDate>Mon, 30 Jun 2025 07:34:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=44420497</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44420497</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44420497</guid></item><item><title><![CDATA[New comment by chipx86 in "Use keyword-only arguments in Python dataclasses"]]></title><description><![CDATA[
<p>Yeah, that's the approach we'll be taking in housekeeping. I didn't want to complicate the example any more than I already did :)</p>
]]></description><pubDate>Mon, 30 Jun 2025 07:24:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=44420434</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44420434</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44420434</guid></item><item><title><![CDATA[New comment by chipx86 in "Use keyword-only arguments in Python dataclasses"]]></title><description><![CDATA[
<p>That's always the challenge when iterating on interfaces that other people depend on.<p>What we do is go through a deprecation phase. Our process is:<p>* We provide compatibility with the old signature for 2 major releases.<p>* We document the change and the timeline clearly in the docstring.<p>* The function gets decorated with a helper that checks the call, and if any keyword-only arguments are provided as positional, it warns and converts them to keyword-only.<p>* After 2 major releases, we move fully to the new signature.<p>We buit a Python library called housekeeping (<a href="https://github.com/beanbaginc/housekeeping">https://github.com/beanbaginc/housekeeping</a>) to help with this. One of the things it contains is a decorator called `@deprecate_non_keyword_only_args`, which takes a deprecation warning class and a function using the signature we're moving to. That decorator handles the check logic and generates a suitable, consistent deprecation message.<p>That normally looks like:<p><pre><code>    @deprecate_non_keyword_only_args(MyDeprecationWarning)
    def my_func(*, a, b, c):
        ...
</code></pre>
But this is a bit more tricky with dataclasses, since `__init__()` is generated automatically. Fortunately, it can be patched after the fact. A bit less clean, but doable.<p>So here's how we'd handle this case with dataclasses:<p><pre><code>    from dataclasses import dataclass
    
    from housekeeping import BaseRemovedInWarning, deprecate_non_keyword_only_args
    
    
    class RemovedInMyProject20Warning(BaseRemovedInWarning):
        product = 'MyProject'
        version = '2.0'
    
    
    @dataclass(kw_only=True)
    class MyDataclass:
        a: int
        b: int
        c: str
    
    MyDataclass.__init__ = deprecate_non_keyword_only_args(
        RemovedInMyProject20Warning
    )(MyDataclass.__init__)

</code></pre>
Call it with some positional arguments:<p><pre><code>    dc = MyDataclass(1, 2, c='hi')

</code></pre>
and you'd get:<p><pre><code>    testdataclass.py:26: RemovedInMyProject20Warning: Positional arguments `a`, `b` must be passed as keyword arguments when calling `__main__.MyDataclass.__init__()`. Passing as positional arguments will be required in MyProject 2.0.
      dc = MyDataclass(1, 2, c='hi')

</code></pre>
We'll probably add explicit dataclass support to this soon, since we're starting to move to kw_only=True for dataclasses.</p>
]]></description><pubDate>Mon, 30 Jun 2025 06:22:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=44420062</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44420062</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44420062</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>I'm really glad it was useful for you and your teams! :) Hearing that kind of thing always brightens my day. I've felt very lucky getting to work on this as my job all these years.<p>It'd have been amazing having something like DiffX when we started building some of these SCM integrations too. It's really saved us a lot of trouble with some of the recent ones we've built (PlasticSCM / Unity Version Control, Keysight SOS, and ClearCase), which didn't have a format to work with and needed a lot of extra metadata for lookups and some other stuff.</p>
]]></description><pubDate>Wed, 04 Jun 2025 08:42:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=44178538</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44178538</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44178538</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>Yep! We spent 20 years dealing with these problems and in those 20 years nobody really solved these pain points. So we talked to some SCM vendors, bounced ideas around, built a spec, got feedback from them, repeated off-and-on for a couple years until we got the current draft, and implemented it for our needs.<p>It's been a few years now, and so far so good for the purposes we built it for. And it's there for any other tool or SCM authors to use if it also happens to be useful to them.</p>
]]></description><pubDate>Wed, 04 Jun 2025 08:23:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=44178436</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44178436</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44178436</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>Generally-speaking, you probably shouldn't have to deal with these problems unless you're writing a tool that has to interface with certain SCMs or SCMs used in certain environments. I'll give you some examples for each of these points:<p>1. There are two important areas where encoding can matter: The filename and the diff content.<p>Git pays attention to filename encoding, but most SCMs don't, so when a diff is generated, it's based on the local encoding. If there are any non-ASCII characters in that filename, a diff generated in one environment with one encoding set can end up not applying to another (or, in our case, not being able to be looked up from a repository). This isn't <i>common</i> but it can happen (we've seen this on Perforce and Subversion).<p>Then there's the content. Many SCMs will actually give you a representation of a text file and not the raw contents itself. That text file will be re-encoded for your local/preferred encoding, and newlines may be adjusted as well (`\r\n`, `\n`). The text file is then re-encoded back when pushing the change. This allows people in different environments to operate on the same file regardless of what encoding they're working with.<p>This doesn't necessarily make its way into the diff, though. So when you send a diff from a less-common encoding to a tool to process it, and that tries to apply it to the file checked out with its encoding, it can fail to patch.<p>The solution is to either know the encoding of the file you're processing, or try to guess it (some tools, like ours, let you specify a list of preferred encodings to try).<p>It's best if you can know it up-front.<p>Bonus Fun Fact: On some SCMs (Perforce comes to mind), checking out a file on Windows and then diffing it Linux via a shared mount can get you a diff with `\r\r\n` newlines. It's a <i>bad time</i> and breaks patching. And it used to come up a lot, until we worked around it.<p>Also, Perforce for a while would sometimes normalize encodings incorrectly and you'd end up with BOMs in the diff, breaking GNU patch.<p>2. It does when you're working with them directly for applying and patching. If you're handing them off to a tool for processing, if there's any risk of one file in a sequence not being included, you can end up with breakages that maybe you don't see until later processing.<p>It's also just really nice having all the state and metadata up-front so we can process it in one go in a consistent way without having to sanity-check all the diffs against each other.<p>When working locally, it also depends on your tooling. `git format-patch` and `git am` are great, but are for Git. If I'm working with (let's just say) Subversion, I need to do my own thing or find another tool.<p>3. It's critical for the kind of information needed to locate files in a repository. Some systems need a commit-wide identifier. Some need per-file identifiers. Some need a combination of the two. Some need those plus additional data not otherwise represented in the path or revision (generally more enterprise SCMs targeting certain use cases).<p>It's also critical for representing information that isn't in the Unified Diff format (namely, anything but the filename). So, symlink information, file modes, SCM-specific properties on a file or directory, to name a few. This information needs to live somewhere if a SCM provides it, and it's up to every SCM to choose how and where to store that data (and then how it's encoded, etc.).</p>
]]></description><pubDate>Wed, 04 Jun 2025 08:09:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=44178347</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44178347</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44178347</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>If wishing made it so...<p>I have so many stories I could tell at this point.</p>
]]></description><pubDate>Wed, 04 Jun 2025 07:37:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=44178146</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44178146</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44178146</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>Yeah the nomenclature sucks.<p>When talking about the file, the two terms are often used interchangeably (and are usually a .diff or a .patch extension).<p>For fun, the GNU Patch manpage says:<p>"NAME: patch - apply a diff file to an original"<p>followed by:<p>"patch takes a patch file patchfile containing ..."<p>"patch tries to skip any leading garbage, apply the diff, and then ..."</p>
]]></description><pubDate>Wed, 04 Jun 2025 07:29:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=44178090</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44178090</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44178090</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>We build a code review product that interfaces with over a dozen SCMs. In about 20 years of writing diff parsers, we've encountered all kinds of problems and limitations in SCM-generated diff files (which we have to process) that we wouldn't ever have expected to even consider thinking about before. This all comes from the pain points and lessons learned in that work, and has been a huge help in solving these for us.<p>These aren't problems end users should hopefully ever need to worry about, but they're problems that tools need to worry about and work around. Especially for SCMs that don't have a diff format of their own, have one that is missing data (in some, not all changes can be represented, e.g. deleted files), or don't include enough information for another tool to identify the file in a repository.</p>
]]></description><pubDate>Wed, 04 Jun 2025 07:23:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=44178046</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44178046</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44178046</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>difftastic is great!<p>This isn't a tool for viewing changes to files or to ASTs. This is a way of being able to generate a single diff file for processing or patching that addresses the kinds of problems we've encountered in over 20 years of building diff parsing tooling and working with over a dozen SCMs with varying levels of completeness or brokenness of bespoke custom diff formats.<p>It's not an end user tool, but a useful format for tools like code review products to use.</p>
]]></description><pubDate>Wed, 04 Jun 2025 07:18:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=44178013</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44178013</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44178013</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>Created by the Git team for Git's purposes, rather than something documented or proposed for wider adoption.<p>Other SCMs can and do use a Git-style diff format, but as there's no defined grammar, there are sometimes important differences. For example, Mercurial's Git-style diffs represent the revisions in a different format than Git's does with different meanings, reuse Git "index" lines for binary files but include SHAs of the file contents instead of any sort of revision, and have a header block that should be stripped out before sending to a Git-style diff parser.</p>
]]></description><pubDate>Wed, 04 Jun 2025 07:08:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=44177948</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44177948</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44177948</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>In the early drafts, we played with a number of approaches for the structure. Things like "commit-meta", etc. In the end, we broke it down into `#<section_level><section_type>`, just to simplify the parsing requirements. Every meta block is a meta block, and knowing what section level you're supposed to be in and comparing to what section level you get become a matter of "count the dots".<p>The header formats are meant to be very simple key/value pairs that are known by the parser, and not free-form bits of metadata. That's what the "meta" blocks are for. The parsing rules for the header are intentionally very simple.<p>JSON was chosen after a lot of discussion between us and outside parties and after experimentation with other grammars. The header for a meta block can specify a format used to serialize the data, in case down the road something supplants JSON in a meaningful way. We didn't want to box ourselves in, but we also don't want to just let any format sit in there (as that brings us back to the format compatibility headaches we face today).<p>For the other notes:<p>1. Compatibility is a key factor here, so we'd want to go with base-level JSON. I'd prefer being able to have trailing commas in lists, but not enough to make life hard for someone implementing this without access to a JSON5 parser.<p>2. If your goal is to simply feed to GNU patch (or similar), you can still split it. This extra  data is in the Unified Diff "garbage" areas, so they'll be ignored anyway (so long as they don't conflict, and we take care to ensure that in our recommendations on encoding).<p>If your goal is to split into two DiffX files, it does become more complicated in that you'd need to re-add the leading headers.<p>That said, not all diff formats used in the wild can be split and still retain all metadata. Mercurial diffs, for example, have a header that must be present at the top to indicate parent commit information. You can remove that and still feed to GNU patch, but Mercurial (or tools supporting the format) will no longer have the information on the parent commit.<p>3. Revisions depend heavily on the SCM. Some SCMs use a commit identifier. Some use per-file identifiers. Some use a combination of the two. Some use those plus additional information that either gets injected into the diff or needs to be known out-of-bounds. There's a wide variety of requirements here across the SCM landscape.</p>
]]></description><pubDate>Wed, 04 Jun 2025 07:02:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=44177911</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44177911</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44177911</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>Git is using a proprietary variant on top of Unified Diffs. Unified Diffs themselves convey very little information about the file being modified, focusing solely on the line-based contents of text files and allowing vendors to provide their own "garbage" lines containing anything else. Every SCM that tracks information beyond line changes in a diff fills out the garbage data differently.<p>The intent here isn't to let you copy changes from one type of repository to another, but to have a format that can be generated from many SCMs that a tool could parse in a consistent way.<p>Right now, tools working with diffs from multiple types of SCMs need at least one diff parser per SCM (some provide multiple formats, or have significantly changed compatibility between releases.<p>For SCMs that lack a diff format (there are several) or lack one that contains enough information to identify a file or its changes (there are several), tools also need to choose a method to represent that information. That often means yet another custom diff format that is specific to the tool consuming the diff.<p>We've spent over 20 years dealing with the headaches and pain points here, giving it a lot of thought. DiffX (which is now a few years old itself) has worked out very well as a solution for us. This wasn't done in a vacuum, but rather has gone through many rounds of discussion with developers at a few different SCM vendors who have given thought to these issues and supplied much valuable feedback and improvements for the spec.</p>
]]></description><pubDate>Wed, 04 Jun 2025 06:50:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=44177846</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44177846</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44177846</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>Absolutely agree. I think there's a lot of avenues to explore for better diff representations for structured data (which would also be great for ASTs, something we've been thinking about).<p>This format is meant to be an extension of Unified Diffs (much like the diff formats of most SCMs), and not something entirely new and focusing on other areas. But if more specific diff formats become widespread, we could directly support encoding them within DiffX as well, as we do for binary diffs formats.</p>
]]></description><pubDate>Wed, 04 Jun 2025 06:40:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=44177803</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44177803</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44177803</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>I have a much-too-long-for-one-comment write-up about this, but it's basically for those who build SCMs or tools that need to work with SCMs. End users shouldn't have to care about this.<p>There's not one patch/diff format. There's often at least one per SCM. A couple are pretty good (Git's), many are okay (Subversion's), and many are really bad or non-existent.<p>I founded one of the older code review products, Review Board (turning 20 next year), and we deal with the problems this is trying to solve all the time, across over a dozen SCMs. So we're the ones complaining :) And much of this is based on extensive feedback from SCM vendors we've spoken to about this at length.<p>Most people shouldn't have to care. But it benefits tools like ours that have to deal with the nightmare that is the world of diff formats.</p>
]]></description><pubDate>Wed, 04 Jun 2025 06:35:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=44177770</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44177770</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44177770</guid></item><item><title><![CDATA[New comment by chipx86 in "DiffX – Next-Generation Extensible Diff Format"]]></title><description><![CDATA[
<p>The repository metadata absolutely should own the commit information.<p>Diff files are there to represent a delta state of the repository, a difference between a range of changes. Those may be one or more commits, or one more changes across individual files (not all SCMs manage state in terms of atomic commits). File changes, file attribute changes, SCM-specific metadata changes, and commit history information.<p>That delta state should be able to be applied to another tree in order to get the same end result. This is what diff files are ultimately there for.<p>Git diffs do this today, and they do it well (but they're pretty Git-specific). Many SCMs (and there are a lot of them) don't include a format on that level, or a format at all. Hence DiffX.</p>
]]></description><pubDate>Wed, 04 Jun 2025 06:31:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=44177758</link><dc:creator>chipx86</dc:creator><comments>https://news.ycombinator.com/item?id=44177758</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44177758</guid></item></channel></rss>