Print apenas git commit sha e um pattern usando sed

1

Estou correndo do terminal no OSX e recebo um formato de log git como:

* 58dbb08 Joe Blogs 5 weeks ago | [ABC-123] Commit message contents 
* 5a9c5e1 Jane Doe 3 weeks ago | Commit Contents with XYZ-987 jira ticket number
* 6070ee0 Some Person 3 weeks ago | Commit which references [MNO-456, MNO-999]

Eu gostaria de gerar uma lista na CLI (usando git log, grep, sort, sed) no OSX, que imprimiria o log em tal formato:

  58dbb08 │ ABC-123
  5a9c5e1 │ XYZ-987
  6070ee0 │ MNO-456, MNO-999
──────────│──────────────────────
   ꜛ sha  │  ꜛ jira tickets

O objetivo é que nosso QA possa extrair uma lista de tickets do Jira que foram referenciados dentro do git commits, e então encontrar facilmente o commit / ticket associado olhando pela lista

Eu tenho pouca experiência em sed e tenho dificuldades em entender as formas de extrair e substituir padrões e, em seguida, imprimir apenas os padrões correspondentes. Eu li os documentos, mas parte da linguagem é desconhecida, considerando que raramente toquei em unix / regex e não consegui decifrar como extrair vários padrões e substituir strings não combinadas.

Com o que estou trabalhando atualmente;

git log --oneline 7.2.0..HEAD | 
    grep -iEo "([a-f0-9]{7})(.*[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    sort -u | 
    sed -n "s/\([a-zA-Z0-9]\{2,7\}-[0-9]\{1,4\}\)/,  /pg"

que me leva a;

58dbb08 Joe Blogs 5 weeks ago | [, ABC-123
5a9c5e1 Jane Doe 3 weeks ago | Commit Contents with , XYZ-987 
6070ee0 Some Person 3 weeks ago | Commit which references [, MNO-456 , , MNO-999

que está perto, mas não consigo me livrar das coisas que não preciso

    
por simey.me 12.01.2017 / 08:30

1 resposta

1

Então, eu puni meu pequeno cérebro, empurrei e inventei uma solução feia .

Eu não acho que seja o melhor, então eu ainda aprecio / aceito qualquer ajuda e melhorias!

git log 7.2.0..HEAD --oneline | 
    grep -iEo "([a-f0-9]{7})(.*[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    sort -u | 
    sed -E $'s/([a-f0-9]{7}|[a-zA-Z0-9]{2,7}-[0-9]{1,4})/ \\n\1\\n/g' | 
    grep -iEo "([a-f0-9]{7}|[a-zA-Z0-9]{2,6}-[0-9]{1,4})+" | 
    tr '\n' ' ' | 
    sed -E $'s/([a-f0-9]{7})/\\n\1 →/g' | 
    sed -E 's/([a-zA-Z0-9]{2,7}-[0-9]{1,4})/,/g' | 
    sed -E 's/(..)$//'

este comando divide as expressões correspondentes em várias linhas usando sed para inserir um pouco de \n , então grep s as expressões de que preciso, e somente as mantém. Então, finalmente, ele volta e substitui esses \n pelos caracteres e , respectivamente, depois aparando o último , .

Eu acabo com:

58dbb08 → ABC-123
5a9c5e1 → XYZ-987
6070ee0 → MNO-456, MNO-999

Eu acho isso decentemente rápido em um tamanho de log de menos de 200 commits ... sua finalidade é ajudar a gerar algumas listas de problemas nas notas de lançamento, então não deve ser muito mais do que isso. Mas novamente; Quaisquer melhorias de velocidade / qualidade são bem recebidas!

    
por 12.01.2017 / 08:30