Uma questão que surge ocasionalmente é qual é a melhor maneira de determinar a lista de mudanças que você sincronizou pela última vez no Perforce. Isso geralmente é necessário para coisas como injetar o número da lista de mudanças nas informações de revisão pelo sistema de compilação automática.
117
p4 changes | head -1
parece mais fácil do que a maioria dessas soluções.Respostas:
Eu recomendo o oposto para sistemas de construção automática: você deve primeiro obter a lista de mudanças mais recente do servidor usando:
em seguida, sincronize essa alteração e registre-a nas informações de revisão. A razão é a seguinte. Embora Perforce recomende o seguinte para determinar a lista de mudanças com a qual o espaço de trabalho é sincronizado:
eles observam algumas pegadinhas:
e há uma pegadinha adicional que eles não mencionam:
Se você deve sincronizar primeiro e gravar depois, Perforce recomenda executar o seguinte comando para determinar se você foi mordido pelas pegadinhas acima; deve indicar que nada foi sincronizado ou removido:
fonte
#have
vez de@clientname
, o que evita que você tenha que procurar o nome do seu espaço de trabalho do cliente.Apenas para responder a essa pergunta, mantendo a sugestão de Jeff de usar Stackoverflow como um lugar para manter fragmentos técnicos ....
Na linha de comando, use:
E apenas substitua pelo nome da especificação do seu cliente. Isso produzirá a saída do formulário:
Que é facilmente analisado para extrair o número da lista de mudanças.
fonte
Você pode tentar encontrar o número máximo de alteração na saída do comando "arquivos p4". O diretório de trabalho não deve conter commits pós-sincronização, no entanto. Isso é um pouco melhor do que
já que o último parece funcionar no servidor e pode falhar em grandes árvores de origem devido aos limites de "MaxResults".
onde p4lastchange.py é baseado no código da apresentação Using P4G.py From the Command Line de JTGoldstone, Kodak Information Network / Ofoto, 15 de abril de 2005.
fonte
Se estiver usando P4V, você pode fazer isso graficamente:
fonte
p4 changes -m1 @clientname
que é a maneira "recomendada" de fazer isso para meu cliente leva cerca de 10 minutosisso é o que eu uso:
para o mesmo cliente leva 2,1 segundos
fonte
p4 changes -m1 @clientname
correr sem parar ...p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
realmente funciona! Obrigado!Você também pode usar o comando cstat:
p4 help cstat
fonte
Para um build sério (aquele que está sendo preparado para teste), especifique explicitamente o rótulo desejado ou número da lista de mudanças, sincronize com o rótulo e inclua-o nos artefatos de compilação.
Se uma changelist (ou rótulo) não for fornecido, use
p4 counter change
para obter o número da alteração atual e registre-o. Mas você ainda precisa sincronizar tudo usando esse número de alteração.Não acho que você possa conseguir exatamente o que deseja, porque, em geral, um espaço de trabalho inteiro não é sincronizado com um número de changelist específico. É possível sincronizar explicitamente alguns arquivos para revisões mais antigas e, então, um único número da lista de mudanças não faz sentido. É por isso que um novo
sync
é necessário para garantir que um único número da lista de mudanças represente com precisão a versão do código.Com relação aos comentários: Sim, minha resposta deve ser usada por gerentes de configuração que estão preparando uma construção para fornecer ao controle de qualidade. Nossos desenvolvedores normalmente não sincronizam como parte de uma construção; eles fazem uma compilação antes de enviar - para que possam ter certeza de que suas alterações não quebrem a compilação ou os testes. Nesse contexto, não nos preocupamos em incorporar um rótulo de repositório.
Com sua abordagem, você está assumindo que todo o seu espaço de trabalho foi sincronizado com o head no momento do seu último envio de changelist e que a changelist incluiu todos os seus arquivos abertos. É muito fácil se enganar nessas suposições, difíceis de detectar e terrivelmente caro em termos de tempo perdido. Por outro lado, resolver o problema é fácil, sem inconvenientes. E como um número da lista de mudanças pode ser especificado explicitamente, não importa qual revisão você precisa ou quão rápido a base de código está mudando.
fonte
Para todo o depósito (não apenas seu espaço de trabalho / cliente)
faz o trabalho, apenas informando a última changelist.
fonte
O melhor que descobri até agora é fazer sua sincronização com qualquer changelist que você deseja construir e então usar as mudanças -m1 //...#have para obter a changelist local atual (revisão).
p4 sync @CHANGELIST_NUM p4 changes -m1 //...#have | awk '{print $ 2}'
Dá a você o número da lista de mudanças que você pode usar onde quiser. No momento, estou procurando uma maneira mais simples do que p4 changes -m1 //...#have.
fonte
Não tenho certeza se você obteve a resposta de que precisava, mas tive um problema semelhante. O objetivo era escrever em nosso logger a versão específica do projeto. O problema é que enquanto estamos fazendo nosso próprio makefile, o sistema geral de construção é controlado por nosso gerenciamento de configuração. Isso significa que todas as soluções que dizem "sincronizar algo e depois fazer algo" realmente não funcionam e eu não queria alterar manualmente a versão sempre que confirmamos (uma fonte segura para erros). A solução (que na verdade é sugerida em algumas das respostas acima) é esta: em nosso makefile, eu faço p4 changes -m1 "./...#have" O resultado para isso é Change change_number on date by user @ client ' msg ' Eu simplesmente crio a mensagem em uma string que é impressa pelo logger (o número da alteração é o elemento importante, mas o outro também é útil para decidir rapidamente se uma determinada versão contém alterações que você sabe que fez por conta própria, sem forçar para verificar). Espero que isto ajude.
fonte