1
votes

Supprimer tous les favoris locaux du référentiel Mercurial

hg bookmarks --delete peut être utilisé pour supprimer un signet.

Est-il possible de supprimer tous les signets d'un dépôt Mercurial via un script bash? Je pense que cela peut être possible en utilisant awk - mais cela me dépasse un peu.

Le format de la sortie hg bookmarks est (par exemple):

2018.02.706 Customer App
2018.02.707 Customer App

Je dois juste obtenir:

2018.02.706 Customer App 5255:c1321f7f3903
2018.02.707 Customer App 5255:c1321f7f3902


0 commentaires

6 Réponses :


2
votes

Cela devrait supprimer le dernier champ:

awk '{$NF=""}1' file

Cela ne fait que définir le dernier champ sur rien:

awk 'NF{NF--}1' file


4 commentaires

ou awk 'NF--' fichier


@Cyrus Ne peut pas être utilisé, avec une ligne vide, vous obtenez ce message awk: cmd. ligne: 1: (FILENAME = t FNR = 4) fatal: NF mis à une valeur négative . C'est pourquoi vous devez définir le dernier champ sur vide ou tester si NF est vrai > 0 puis soustraire 1


Oui, dans ce cas, ce serait un problème. Merci de l'avoir signalé.


Ce premier ( NF-- ) repose sur un comportement indéfini, donc ce qu'il fait variera d'une version awk à l'autre.



1
votes
awk 'sub($NF,"")' file

2018.02.706 Customer App 

2018.02.707 Customer App

3 commentaires

Pour être complet, voici le script que j'ai utilisé pour supprimer les signets hg (il supprime également les espaces de début et de fin): hg bookmarks | awk 'NF' | awk 'sous ($ NF, "")' | awk '{gsub (/ ^ [\ t] + | [\ t] + $ /, ""); imprimer} '| awk '{print "hg bookmarks --delete \ x27" $ 0 "\ x27"}'> clear-bookmarks.sh


@dubs Je dirais, postez ça comme une nouvelle réponse, c'est plus complet que les autres.


Cela échouerait si $ NF contenait des métachars RE. Évitez d'utiliser des données d'entrée dans des expressions régulières ou du texte de remplacement, sauf si nécessaire pour effectuer une tâche spécifique qui le nécessite. $ NF = "" ou sub (/ [^ [: space:]] + $ /, "") ferait la même chose de manière plus robuste mais ceux-ci partiraient toujours des blancs à la fin de chaque ligne, comme le fait votre solution actuelle.



1
votes

En tenant compte de l'assistance des réponses précédentes, voici le script complet que j'ai utilisé pour supprimer les signets mercurial:

hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{ gsub(/^[ \t]+|[ \t]+$/, ""); print }' | awk '{print "hg bookmarks --delete \047" $0 "\047"}' > clear-bookmarks.sh

Utilisez ce qui suit si vous voulez vous assurer que les espaces de début et de fin sont supprimés :

hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{print "hg bookmarks --delete \047" $0 "\047"}' > clear-bookmarks.sh

Mon expérience de script n'est en aucun cas merveilleuse - mais elle semble faire le travail!


3 commentaires

Vous n'avez pas besoin de plusieurs tubes et appels à awk pour faire ce que ces lignes de code feront, elles échoueront étant donné certaines valeurs de $ NF , et vous devriez utiliser octal au lieu de hex pour obtenir le ' s, voir awk.freeshell.org/PrintASingleQuote .


@EdMorton Je ne sais pas comment réduire le nombre de tuyaux. Pour moi, c'est clair, mais j'apprécierais une amélioration suggérée à ma version?


awk 'NF' | awk 'sous ($ NF, "")' | awk '{gsub (/ ^ [\ t] + | [\ t] + $ /, ""); imprimer} '| awk '{print "hg bookmarks --delete \ 047" $ 0 "\ 047"}' équivaut à une seule commande awk awk 'NF && sub ($ NF, "") {gsub (/ ^ [\ t] + | [\ t] + $ /, ""); print "hg bookmarks --delete \ 047" $ 0 "\ 047"} ' mais cela reste fragile, long et inutilement compliqué. Utilisez simplement l'un des scripts que j'ai publiés sur stackoverflow.com/a/56906355/1745001 .



0
votes

En supposant que les espaces dans votre entrée sont des caractères vides tels qu'ils apparaissent dans votre exemple d'entrée, pour faire ce que vous avez demandé dans votre question de manière portable et robuste est:

$ awk '{sub(/ [^ ]+$/,"")}1' file
2018.02.706 Customer App
2018.02.707 Customer App

$ awk '{sub(/ [^ ]+$/,""); print "hg bookmarks --delete \047" $0 "\047"}' file
hg bookmarks --delete '2018.02.706 Customer App'
hg bookmarks --delete '2018.02.707 Customer App'

et pour obtenir la sortie la ligne de commande dans votre réponse produirait est:

$ sed 's/\(.*\) .*$/hg bookmarks --delete '\''\1'\''/' file
hg bookmarks --delete '2018.02.706 Customer App'
hg bookmarks --delete '2018.02.707 Customer App'

Si vous ressentez un désir ardent d'utiliser awk alors ce serait:

$ sed 's/ [^ ]*$//' file
2018.02.706 Customer App
2018.02.707 Customer App

Remplacez / [^] + $ / par / [ [: space:]] + [^ [: space:]] + $ / si l'espace blanc dans votre exemple peut être autre chose qu'un simple caractère vide.


0 commentaires

2
votes

Je pense que cette solution (avec quelques corrections possibles nécessaires) sera plus simple et plus naturel, que awk-ing: pur Mercurial, rien de plus


1 commentaires

Bonne suggestion. Cependant, cela devient délicat avec des espaces dans le nom et ne tient pas compte non plus du fait qu'un ensemble de modifications peut avoir plusieurs signets par rapport à lui, ce qui cause encore plus de difficultés à l'analyse car le -T '{signets} \ n' rapportera (potentiellement ) plusieurs signets par ligne.



1
votes

Si vous voulez vraiment supprimer tous les signets, supprimez simplement le fichier .hg / bookmarks du répertoire caché .hg de votre dépôt.

Les signets peuvent revenir si vous les récupérez depuis un emplacement distant, vous devrez donc également faire hg book push -B 'votre nom de signet' pour supprimer également le signet de la télécommande emplacement, mais c'est un problème auquel vous seriez confronté avec toute autre méthode de suppression de favoris.


0 commentaires