124 votes

Détermination de la dernière liste de changements synchronisée dans Perforce

Une question qui se pose parfois est de savoir quelle est la meilleure façon de déterminer la liste de changements à laquelle vous avez synchronisé pour la dernière fois dans Perforce. Cela est souvent nécessaire pour des choses comme injecter le numéro de la liste de changements dans les informations de révision par le système de build automatique.

0 votes

p4 changes | head -1 semble plus facile que la plupart de ces solutions.

97voto

Syeberman Points 624

Je recommande l'opposé pour les systèmes de construction automatique : vous devriez d'abord obtenir la dernière liste de changements du serveur en utilisant :

p4 changes -s submitted -m1

puis synchroniser ce changement et l'enregistrer dans les informations de révision. La raison en est la suivante. Bien que Perforce recommande ce qui suit pour déterminer la liste de changements à laquelle l'espace de travail est synchronisé :

p4 changes -m1 @clientname

ils notent quelques pièges :

  • Cela ne fonctionne que si vous n'avez rien soumis depuis l'espace de travail en question.
  • Il est également possible qu'un espace de travail client ne soit pas synchronisé sur une liste de changements spécifique.

et il y a un autre piège qu'ils ne mentionnent pas :

  • Si la liste de changements la plus élevée à laquelle la synchronisation s'est produite a strictement supprimé des fichiers de l'espace de travail, la liste de changements suivante la plus élevée sera signalée (à moins qu'elle aussi n'ait strictement supprimé des fichiers).

Si vous devez d'abord synchroniser et enregistrer plus tard, Perforce recommande d'exécuter la commande suivante pour déterminer si vous avez été touché par les pièges mentionnés ci-dessus ; cela devrait indiquer que rien n'a été synchronisé ou supprimé :

p4 sync -n @changelist_number

Notez que cette méthode ne fonctionne pas si un fichier est ajouté dans une liste de changements (n-1) et ensuite supprimé dans la liste de changements suivante (n). p4 changes -m1 @clientname et p4 changes ...#have renvoient tous deux n-3 et p4 sync -n @n-3 indiquera "fichier(s) à jour".

0 votes

Pourquoi est-ce que "Cela fonctionne uniquement si vous n'avez rien soumis à partir de l'espace de travail en question." ?

0 votes

Si vous soumettez une modification, 'p4 changes -s soumis -m1' vous renverra votre numéro de liste de modifications. Par exemple, supposons que vous synchronisez avec la liste de modifications 5, attendez quelques heures, puis soumettez la liste de modifications 10. La commande de modifications ci-dessus renverra 10.

1 votes

Le lien est mort, était-ce cet article ? answers.perforce.com/articles/KB/3458/

32voto

Greg Whitfield Points 3651

Juste pour répondre à moi-même en suivant la suggestion de Jeff d'utiliser Stackoverflow comme un endroit pour conserver des extraits techniques....

Depuis la ligne de commande utiliser:

p4 changes -m1 @

Et remplacer simplement par le nom de votre spécification client. Cela produira une sortie sous la forme:

Changement 12345 le 21/08/2008 par joebloggs@mainline-client '....première ligne de la description...'

Qui peut être facilement analysée pour extraire le numéro du changement.

0 votes

Je reçois : Demande trop importante (supérieure à 1500000) ; voir 'p4 help maxresults'.

0 votes

@user674669 : utilisez l'option -m1 qui ne renvoie que la dernière (1) liste de modifications

0 votes

Cela donne l'information du dernier changelist soumis, pas du dernier changelist synchronisé, ce que l'op voulait savoir.

16voto

eel ghEEz Points 303

Vous pouvez essayer de trouver le numéro de changement maximal dans la sortie de la commande "p4 files". Le répertoire de travail ne doit pas contenir de commits post-sync, cependant. C'est juste un peu mieux que

p4 changes -m1 "./...#have"

car ce dernier semble s'exécuter sur le serveur et peut échouer sur de gros arbres source en raison des limites de "MaxResults".

$ p4 changes -m1 "./...#have"
Request too large (over 850000); see 'p4 help maxresults'.

$ p4 -G files "./...#have" | python c:/cygwin/usr/local/bin/p4lastchange.py
Files: 266948
2427657

où p4lastchange.py est basé sur le code de la présentation Using P4G.py From the Command Line par J.T.Goldstone, Kodak Information Network/Ofoto, le 15 avril 2005.

#! /usr/bin/env python
import sys, os, marshal

if os.name == "nt":
    # Désactiver la traduction des sauts de ligne sous Windows.  Les autres systèmes d'exploitation ne traduisent pas le contenu des fichiers.
    import msvcrt
    msvcrt.setmode( sys.stdin.fileno(), os.O_BINARY )

lastcl = 0
num = 0
try:
    while 1:
        dict = marshal.load(sys.stdin)
        num = num + 1
        for key in dict.keys():
            # print "%s: %s" % (key,dict[key])
            if key == "change":
                cl = int(dict[key])
                if cl > lastcl:
                    lastcl = cl
except EOFError:
    pass
print "Files: %s" % num
print lastcl

9voto

Gabor Maghera Points 31

Vous pouvez également utiliser la commande cstat :

p4 help cstat

cstat -- Affiche l'état des changements/synchronisations pour le client actuel

p4 cstat [fichiers...]

Affiche les changements nécessaires, effectués ou partiellement synchronisés dans le client actuel. La sortie est renvoyée dans un format balisé, similaire à la commande fstat.

Les champs affichés par cstat sont :

    changement   numéro du changement
    état   'avoir', 'besoin' ou 'partiel'

0 votes

Cela a fonctionné le mieux pour moi, j'ai exécuté la commande commits.txt puis j'ai ouvert le fichier texte généré dans notepad++ et j'ai fait un ctrl+F jusqu'à la première instance du mot "need"

5voto

erickson Points 127945

Pour une construction sérieuse (celle qui est en cours de préparation pour les tests), spécifiez explicitement l'étiquette désirée ou le numéro de changement souhaité, synchronisez vers une étiquette, et incorporez-la dans les artefacts de construction.

Si aucun numéro de changement (ou étiquette) n'est donné, utilisez p4 counter change pour obtenir le numéro de changement actuel, et enregistrez-le. Mais vous devez toujours synchroniser tout en utilisant ce numéro de changement.

Je ne pense pas que vous puissiez atteindre exactement ce que vous voulez, car en général, un espace de travail entier n'est pas synchronisé vers un numéro de changement particulier. On peut synchroniser explicitement certains fichiers vers des révisions antérieures, et ensuite un seul numéro de changement est sans signification. C'est pourquoi une nouvelle synchronisation est nécessaire pour s'assurer qu'un seul numéro de changement représente correctement la version du code.


En ce qui concerne les commentaires : Oui, ma réponse est destinée aux gestionnaires de configuration préparant une construction à remettre à la QA. Nos développeurs ne synchronisent généralement pas dans le cadre d'une construction ; ils effectuent une construction avant de soumettre—afin de s'assurer que leurs modifications ne cassent pas la construction ou les tests. Dans ce contexte, nous ne nous embêtons pas à incorporer une étiquette de dépôt.

Avec votre approche, vous supposez que tout votre espace de travail était synchronisé vers la tête au moment de votre dernière soumission de changement, et que ce changement incluait tous vos fichiers ouverts. Il est trop facile de se tromper dans ces suppositions, difficile à détecter, et terriblement coûteux en termes de temps perdu. En revanche, résoudre le problème est facile, sans inconvénients. Et parce qu'un numéro de changement peut être spécifié explicitement, peu importe la révision dont vous avez besoin ou la rapidité avec laquelle la base de code évolue.

0 votes

Erickson - belle suggestion, mais je pense qu'elle couvre un ensemble de circonstances légèrement différent de la réponse que j'ai fournie. Certainement counter fonctionnera si vous avez probablement que la dernière révision, et que le serveur n'est pas assez occupé pour qu'une personne, peut-être en train de travailler sur un autre projet, ne ferait pas un soumettre entre la synchronisation et l'appel à p4 counter. Donc, je pense que votre suggestion est probablement meilleure lorsque le système de construction fait une extraction distincte avant de construire. Ma réponse couvre des cas où la synchronisation peut être séparée dans le temps de la construction. Les deux sont valides selon les circonstances je pense.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X