nvie / git-toolbelt

A suite of useful Git commands that aid with scripting or every day command line usage
BSD 3-Clause "New" or "Revised" License
1.25k stars 111 forks source link

Replacing `rev` in `git-modified`; second try #58

Open ernstki opened 1 year ago

ernstki commented 1 year ago

I'm looking for a way to accomplish what git-modified is accomplishing with rev, without rev, as discussed in #29 and incorrectly implemented in #39.

https://github.com/nvie/git-toolbelt/blob/2eec073a4e12b7f6e70f6d4713de75b8642c4e90/git-modified#L124

It looks like you had to do the rev stuff in 4ea5c29 to account for some change in the output of git log circa 2018.

I didn't understand what was going on with the revs there for a good long while, but now I do[^fn1]; when a rename happens, there are three columns in the output, and you want the last one.

@nvie, would you be amenable to using awk for this, or is that a dependency you'd hoped to steer clear of? People are likely to have a functional awk even if they're missing rev, although I'll have to double-check if that's the case with Git Bash. On the other hand, some sort of while IFS="$TAB" reading might do the trick, too, in plain shell script.

[^fn1]: this SO question was helpful in that regard

ernstki commented 1 year ago

Just for my own edification, here's the command I ran on the git-toolbelt repo as evidence that the output of git log --name-status really does have more than two columns sometimes.

git log --oneline | awk '{print $1}' \
  | xargs -I{} sh -c 'git log -1 --name-status --pretty=format:"" {}' \
  | awk -F'\t' 'NF!=2'

# result:
# R100  git-aa  git-stage-all
# R100  git-cc  git-unstage-all
# R100  git-unmerge git-undo-merge

Today I learned!

nvie commented 1 year ago

would you be amenable to using awk for this, or is that a dependency you'd hoped to steer clear of?

The ... | rev | cut | rev trick is a bit stupid, I agree, but it's a fairly common Unix idiom I've often seen in scripts when you want to use cut in a shell script and want to pick fields from the end if you don't know how many fields are on a line.

I don't mind to switch it over to awk, if you think awk is more commonly available than cut, but even cut seems fairly common to me. Anway, as long as the implementation is solid, I'm happy to take the contribution 👍

ernstki commented 1 year ago

The ... | rev | cut | rev trick is a bit stupid, I agree, but it's a fairly common Unix idiom I've often seen in scripts when you want to use cut in a shell script and want to pick fields from the end if you don't know how many fields are on a line.

No judgements from my side! It's just that rev was a bit of a sticking point for Windows (Git Bash) users, as I recall.

I'll check again, though. Maybe the situation has changed. Certainly the landscape of Unix-on-Windows has changed, with WSL being fairly well established now.