[HN Gopher] GQL - Git Query Language
       ___________________________________________________________________
        
       GQL - Git Query Language
        
       Author : amrdeveloper
       Score  : 95 points
       Date   : 2023-12-02 14:06 UTC (8 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | pokstad wrote:
       | Looks very cool. Does this produce a shell snippet with the
       | appropriate git commands? I like the idea of this being a very
       | thin frontend to git.
        
       | chx wrote:
       | The concept is interesting but the data exposed makes it kind of
       | hard to run interesting queries. Like, do we have a branch where
       | the last commit was a year ago?
       | 
       | Also it seems up arrow doesn't work to recall the previous
       | command?
        
       | dafelst wrote:
       | This is a super cool idea, I've been playing with Git internals
       | and having this as a tool/reference will be super helpful. Thanks
       | for sharing!
       | 
       | I don't see it in the code, but have you considered creating
       | secondary indexes to speed up some operations? Things like
       | looking up the path of a deleted file in a large repo?
        
       | zffr wrote:
       | Have you considered using SQLite vtables for this?
        
         | savolai wrote:
         | +1 Being able to browse with an sqlite ui would be lovely.
        
       | bastardoperator wrote:
       | I like the idea, and I like sql, but I feel like this is a lot
       | more typing for the same information you could extract using just
       | git commands. Am I missing something? Take for instance:
       | 
       | The commit example:                   select name, count(name),
       | from commits group by name
       | 
       | is actually:                   git shortlog -sn
       | 
       | The tag example:                   select * from tags
       | 
       | is actually:                   git tag
       | 
       | The branch example:                   select * from branches
       | 
       | is actually:                   git branch
        
         | snordgren wrote:
         | It may be more typing but I can write SQL in my sleep whereas
         | the git CLI I cannot.
         | 
         | Though if I regularly needed the information that this tool
         | retrieves I would probably have memorized the relevant CLI
         | commands by now.
        
         | umvi wrote:
         | Sql is a more well known DSL than git CLI
        
         | dtgriscom wrote:
         | The git CLI is notoriously irregular, as can be seen by your
         | examples. Having a clean, regular language to query git objects
         | seems valuable.
        
         | esafak wrote:
         | This approach falls flat when you start doing analytical
         | queries, and it assumes you already know the git incantations,
         | which most people don't.
        
         | joshuanapoli wrote:
         | At least the SQL-like syntax is more consistent. It might be
         | easier to figure out how to make any given query starting from
         | the SQL "schema".
        
         | paulddraper wrote:
         | 1. SQL is more consistent
         | 
         | 2. SQL is more capable
         | 
         | 3. SQL is more well-known
        
       | fragmede wrote:
       | Unfortunate name, given that GraphQL already exists.
       | 
       | https://en.wikipedia.org/wiki/Graph_Query_Language
        
         | jakewins wrote:
         | Also an ISO track thing https://www.gqlstandards.org/
        
         | ghusbands wrote:
         | I've always seen it written as GraphQL, rather than GQL, though
         | that wikipedia page indeed calls it GQL multiple times.
        
           | 8n4vidtmkvmk wrote:
           | Because that one is apparently unrelated to GraphQL. Horrible
           | naming.
        
         | Hamuko wrote:
         | I guess it's not the only unfortunate name considering your
         | link begins with the words "Not to be confused with GraphQL".
        
       | lloydatkinson wrote:
       | What would a more complex query look like with that, for example,
       | querying for any commit that affected any file in a list of
       | files, by a specific author?
        
       | setheron wrote:
       | Apache Calcite has this as an integration as does SQLite though
       | virtual tables.
       | 
       | Nonetheless nice work
        
       | jakubmazanec wrote:
       | Why would someone use SQL, famously bad language, as a query
       | language for git, famously badly designed CLI?
        
         | mpalmer wrote:
         | "Famously bad" is an opinion cloaked in adverbial authority.
         | Plenty of people like both, and even if they don't like them,
         | they think better in one vs the other.
        
           | 8n4vidtmkvmk wrote:
           | SQL is ok, it just needs to be refined a bit. This was such
           | an opportunity but they didn't cease it.
        
       | ebfe1 wrote:
       | Lovely! I only learnt today that clickhouse has a git-import tool
       | from my colleagues at ClickHouse. So if you also want to give it
       | a go:
       | 
       | Download clickhouse: curl https://clickhouse.com/ | sh
       | 
       | Check out documentation for git-import: ./clickhouse git-import
       | --help
       | 
       | Then the tool can be run directly inside the git repository. It
       | will collect data like commits, file changes and changes of every
       | line in every file for further analysis. It works well even on
       | largest repositories like Linux or Chromium.
       | 
       | Example of a trivial query:
       | 
       | SELECT author AS k, count() AS c FROM line_changes WHERE
       | file_extension IN ('h', 'cpp') GROUP BY k ORDER BY c DESC LIMIT
       | 20
       | 
       | Example of some non-trivial query - a matrix of authors, how much
       | code of one author is removed by another:
       | 
       | SELECT k, written_code.c, removed_code.c, round(removed_code.c *
       | 100 / written_code.c) AS remove_ratio FROM ( SELECT author AS k,
       | count() AS c FROM line_changes WHERE sign = 1 AND file_extension
       | IN ('h', 'cpp') AND line_type NOT IN ('Punct', 'Empty') GROUP BY
       | k ) AS written_code INNER JOIN ( SELECT prev_author AS k, count()
       | AS c FROM line_changes WHERE sign = -1 AND file_extension IN
       | ('h', 'cpp') AND line_type NOT IN ('Punct', 'Empty') AND author
       | != prev_author GROUP BY k ) AS removed_code USING (k) WHERE
       | written_code.c > 1000 ORDER BY c DESC LIMIT 500
        
         | koolba wrote:
         | > Download clickhouse: curl https://clickhouse.com/ | sh
         | 
         | Does this check the useragent to change the response? Clicking
         | that link shows their home page.
        
           | ebfe1 wrote:
           | that is exaxtly what it does ;) if you don't feel comfortable
           | with curl | sh , you can download clickhouse binary from the
           | repo here https://github.com/ClickHouse/ClickHouse/releases
           | 
           | ;)
        
       | nittanymount wrote:
       | this seems converting graph/tree data model to relational data
       | model ? hmm...
        
       | ellisv wrote:
       | Looks cool. Reminds me of Steampipe except this works on a local
       | git repository.
        
       ___________________________________________________________________
       (page generated 2023-12-02 23:00 UTC)