2016-02-26 1 views
1

Je connais un certain nombre de listes de modifications de mon ami. Je veux passer ce numéro CL à un script Bash, qui va générer un fichier diff lu pour le programme patch (qui va recréer la modification dans le repo git).Ligne de commande Perforce unifified diff d'une liste des modifications mise en attente

Jusqu'à présent, j'ai ceci:

function p4_shelved_cl_to_diff() 
{ 
    p4 describe -S -du $1 > p4_diff.patch 
} 

Il génère la diff, mais les en-têtes sont au format p4:

==== //p4_repo/dir_in_repo/dir/file.cpp#123 (text) === 

alors qu'ils devraient être en

--- dir/file.cpp 
+++ dir/file.cpp 

Alors, que Je cherche une syntaxe p4 spéciale (googled largement, vérifié p4 manuel – peu d'espoir) ou plutôt un sed/awk/quel que soit le script qui fera le changement pour moi.

Des idées, ou peut-être quelqu'un a-t-il déjà écrit?

+0

Essayez la suggestion dans cette réponse pour la conversion de ces en-têtes de fichiers: http://stackoverflow.com/a/8289560/193453 –

+0

Et aussi cette réponse similaire: http://stackoverflow.com/a/13609062/193453 –

+0

Merci . La seconde est plus proche de ce que je cherche, mais cette expression sed ne fonctionne pas. Semble Benjamin W a la version de travail. – Koshmaar

Répondre

1

Cette substitution fonctionne pour votre exemple:

$ sed 's|^====.*/\([^/]*/[^#]*\).*===$|--- \1\n+++ \1|' infile 
--- dir/file.cpp 
+++ dir/file.cpp 

Il fonctionne sur les lignes de départ et se terminant par ==== (se terminant en fait avec ===, mais je crois que c'est juste une faute de frappe dans la question, et il travaillera également pour lignes se terminant par ====).

Il capture tout entre le deuxième à la dernière / et #, ajoute ensuite le --- et +++ sur des lignes distinctes.

Notez que je n'ai pas examiné le format général des en-têtes p4 diff, donc cela pourrait casser dans d'autres cas – la meilleure solution globale serait de réparer ce qui génère les mauvais en-têtes.

+0

Merci! Je ne suis pas sed wizard, mais ça a l'air bien, je vais l'essayer dans deux semaines quand je retournerai au travail :) "Second to last /" et le format général - dans les vrais diffs que j'ai, le dir/file.cpp sth comme dir1/dir2/dir3/fichier.cpp. Je pense que le script devrait avoir le paramètre - nom du dernier dir sur repo, ou le nombre de/pour supprimer, pour le faire fonctionner dans le sens le plus général. Et oui, le mieux serait d'obtenir p4 générer un diff unifié normal. Je suppose que maintenant ce n'est pas possible et je devrais me plaindre très fort sur leurs forums et ensuite attendre quelques semaines/mois pour le correctif. – Koshmaar