# # 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)