AutoArchiveTrigger.py #2

  • //
  • guest/
  • sven_erik_knop/
  • P4Pythonlib/
  • triggers/
  • AutoArchiveTrigger.py
  • View
  • Commits
  • Open Download .zip Download (4 KB)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#
# Copyright (c) 2013 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.
#
# Maintainer: Sven Erik Knop, sknop@perforce.com
#
# Only files of type binary and only those with extensions in ARCHIVE_EXTENSIONS will be archived

from __future__ import print_function
 
import P4
from P4Triggers import P4Trigger
import sys
import os.path

ARCHIVE_EXTENSIONS = [ ".fbx", ".mov", ".pdf" ]

class AutoArchiveTrigger(P4Trigger):

    def __init__( self, archive, kept, **kargs):
        kargs['charset'] = 'none'
        P4Trigger.__init__(self, **kargs)
      
        # need to reset the args in case a p4config file overwrote them
        for (k,v) in kargs.items():
            setattr( self.p4, k, v)
        
        self.archive = archive
        self.kept = kept
        
    def setUp( self ):
        info = self.p4.run_info()[0]
        if "unicode" in info and info["unicode"] == "enabled":
            self.p4.charset = "utf8"
        self.p4.exception_level = 1 # ignore WARNINGS like "no such file"
        self.p4.prog = "AutoArchiveTrigger"
 
    def validate( self ):
        names = []
        for changed_file in self.change.files:
            rev = changed_file.revisions[0]
            if not ("binary" in rev.type): 
                continue
            
            (name, ext) = os.path.splitext(rev.depotFile)
            if not ext.lower() in ARCHIVE_EXTENSIONS:
                continue 
    
            names.append(changed_file.depotFile)

        to_be_archived = []
        filelogs = self.p4.run_filelog(names)
        for candidate in filelogs:
            if len(candidate.revisions) > self.kept:
                to_be_archived.append("{}#{}".format(candidate.depotFile, candidate.revisions[self.kept].rev ))
        
        if to_be_archived:
            self.p4.run_archive("-hD", self.archive, to_be_archived)
        
        return True

# main routine.
# If called from the command line, go in here

if __name__ == "__main__":
    archive = None
    kept = None
    kargs = {}
    try:
      for arg in sys.argv[2:]:
        (key,value) = arg.split("=")
        if key == "archive":
            archive = value
        elif key == "kept":
            kept = int(value)
            if kept < 1:
                print("Need to keep at least one revision, got kept={}. Bailing out ...".format(kept))
                sys.exit(0)
        else:
            kargs[key] = value
    except:
        print("Error, expecting arguments in form key=value. Bailing out ...")
        sys.exit(0)
        
    if not archive or not kept:
        print("Required arguments archive= or kept= missing")
        sys.exit(0)
    
    ct = AutoArchiveTrigger( archive, kept, **kargs )
    sys.exit( ct.parseChange( sys.argv[1] ) )
# Change User Description Committed
#2 8340 Sven Erik Knop Added file filter to archive trigger.
#1 8289 Sven Erik Knop AutoArchiveTrigger

Needs P4Triggers.py to work.

Idea: archive binaries automatically, kind of like +S16, only less destructive.

Needs two additional parameters,

 archive=<name of archive depot>
 kept=<numbers of revisions kept active>

For example

Triggers:
 auto_archive change-commit //depot/bigfiles/... "python AutoArchiveTrigger.py %change% archive=bigarchive kept=5 port=1666 user=admin"

This will archive every binary revisions of a file but the last 5 into an
archive called bigarchive.

kept needs to be bigger than 0

Only use with change-commit trigger, or you are on your on.