# # Copyright (c) 2017 Sven Erik Knop, Perforce Software Ltd # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the # distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE # SOFTWARE, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # User contributed content on the Perforce Public Depot is not supported by Perforce, # although it may be supported by its author. This applies to all contributions # even those submitted by Perforce employees. from __future__ import print_function import P4 import sys class IntegratedChanges: def __init__(self, p4, submitted_change): self.p4 = p4 self.change = submitted_change self.integrated_changes = set() self.integrated_files = set() self.integrated_description = p4.run_describe('-s', submitted_change)[0]['desc'] filelog = self.p4.run_filelog("@{0},{0}".format(submitted_change)) for depotFile in filelog: for revision in depotFile.revisions: for integration in revision.integrations: if integration.how == "copy from": startrev = int(integration.srev) + 1 endrev = int(integration.erev) + 1 for i in range(startrev, endrev): self.integrated_files.add("{}#{}".format(integration.file, i)) integrated_change = self.p4.run_changes("{0}#{1},{1}".format(integration.file, i))[0] self.integrated_changes.add(integrated_change['change']) for change in self.integrated_changes: desc = p4.run_describe('-s', change)[0] use_change = True for file, rev in zip(desc['depotFile'], desc['rev']): file_rev = "{}#{}".format(file, rev) if file_rev not in self.integrated_files: use_change = False if use_change: self.integrated_description += "\n-------------\nIntegrated change {}: {}".format(change, desc['desc']) if __name__ == '__main__': if len(sys.argv) < 2: print("Usage : {} #change".format(sys.argv[0])) sys.exit(1) change = sys.argv[1] p4 = P4.P4() with p4.connect(): integrated_changes = IntegratedChanges(p4, change) print(integrated_changes.integrated_description)
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#2 | 22579 | Sven Erik Knop | Updated copyright notice | ||
#1 | 22578 | Sven Erik Knop |
Little example tool to identify which changes have been completely integrated via copy. The tool will collect the respective change descriptions and append them to the existing change description. Note that this script only prints out the resulting change description. A trigger might run 'p4 change -f' to update the integration description. |